본문 바로가기
워게임/FTZ

FTZ - level20

by meanjung 2021. 7. 28.

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

댓글