hint
일단 포맷스트링 버그구나...
드림핵 강의 정독하고 푸는 게 좋다. https://dreamhack.io/learn/3#23
로그인 | Dreamhack
dreamhack.io
환경변수에 쉘 코드를 등록해놓고,(export MYSHELL=$(python -c 'print "\x90"*0x1000 + "쉘코드"')
그 주소를 구해서 ☞ 나의 경우 0xC0000000 - 0x1000 = 0xBFFFF000
포맷스트링 버그를 이용해 attackme의 ret에 덮어씌우면 되겠다, 라고 생각했다.
하지만 gdb attackme - disas main 이 작동하지 않았다.
그래서 일단, 덮어씌울 주소를 (addr)으로 가정했다.
그렇다면 드림핵 강의에서처럼
쉘코드가 있는 환경변수의 주소가 bfff(=49151) f000(=61440) 이니까
addr + 2 || addr || %(49151-8)c || %4$hn || %(61440-49151)c || %5$hn 이겠거니!!!
☞ %4$hn(addr + 2)을 bfff로 변조 & %5$hn(addr)을 f000으로 변조
* %n은 특정 주소값에 지금까지 출력된 문자열의 길이를 담는다.
addr을 어떻게 구해야 할 지 모르겠어서 addr 구하는 데까지만 롸업을 봤다.
보길 잘했다... 삽질만 엄청 할 뻔.
.dtors
포맷 스트링 버그에서 사용하는 부분
gcc는 컴파일 할 때 .ctors와 .dtors 두 영역을 생성한다.
.ctors는 main() 전에 실행되고
.dtors는 main() 종료 후에 실행된다.
FSB 기법을 사용할 때는 .dtors 함수가 실행되기 전(main이 끝나기 전)에 쉘 코드 주소를 덮는다.
그렇게 되면 main()이 끝날 때 쯤 .dtors가 아닌 쉘 코드를 실행하게 되는 것이다.
readelf -S attackme | grep .dtors 명령어를 이용해 .dtors의 주소를 구할 수 있다.즉, main 문이 끝나기 전 0x08049594 + 4 를 쉘 코드로 덮으면 된다.
때문에 addr 에 0x08049598 을 넣고 그대로 풀면 된다.
'워게임 > FTZ' 카테고리의 다른 글
FTZ - level19 (0) | 2021.07.28 |
---|---|
FTZ - level18 (0) | 2021.07.26 |
FTZ - level17 (0) | 2021.07.26 |
FTZ - level16 (0) | 2021.07.26 |
FTZ - level15 (0) | 2021.07.24 |
댓글