BOF 원정대의 nightmare를 잡아보자!
* 소스코드
(nightmare.c)
nightmare 특징!
ret 주소에 strcpy를 써야한다는 점.
(이번 문제풀이는 엉뚱땅 삽질을 많이했다. 이 포스트에는 삽질의 과정이 그대로 있습니다. 빠른 해법이 궁금하다면 아래쪽부터!, 초반의 잘못된 판단?생각? 들도 그대로 과정대로 적었습니다.)
strcpy를 통해 쓸만한 영역에다가 system 주소와 /bin/sh 문자열을 구성하여 쉘을 획득하자!
먼저 strcpy 주소를 알아내보자!
(strcpy 주소)
(gdb 실행)
그렇다는 것은 ret 주소에 알맞은 주소를 썻다는것!
자 이제 쓸만한 영역을 찾아볼까~
(쓸만한 영역)
즉 나는 여기에다가 복사시킬 것이다.
나의 계획!
저 깨끗한 도화지에다가 버퍼를 복사한다. 버퍼에는 system과 인자 구성이 되어있다.
그 후 fake ebp로 0xbffff710 으로 fake ebp를 한다. 그렇다면 0xbffff714 에 있는 system 함수가 호출되게 하여 쉘을 획득하려는 것!
fake ebp를 이루기 위해 leave-ret 주소 찾기
(leave-ret 주소)
-> printf 로 출력을 하니 출력버퍼가 있을거 같긴하다. (실제로 다른 문제 풀때는 출력버퍼를 이용했었다.)
출력버퍼를 한참 찾다 못찾았지만.. ㅜ strcpy에 내가 적은듯한 것들이 있다? strcpy의 버퍼인가? 무튼 요골 쓰면 괜찮지 않을까?
(좋은것 발견?)
(버퍼?)
(gdb 실행)
(어라?)
-> 아..! 다시 소스코드를 보니 ret 주소 옆에 A로 4개를 덮는다.... (즉 fake ebp 못한다.)
+ 삽질 : strcpy에 버퍼가 어딨어.. ㅜㅜ
아까 본 것은 51... 41(A)가 아닌데.. 착각했다.. (.... )
결국 방향을 바꾸었다.
strcpy로 저 41414141을 덮어쓰자!
바로 system 함수와 + 인자구성으로
그러면 버퍼의 주소 확인하고!
(버퍼주소)
일단 공격
(공격)
(버퍼 찾기)
이제 41414141로 덮여쓰여지는 ret 다음 주소 찾기!
(41414141 위치)
이제 41414141을 내 system함수 + 인자구성으로 덮어쓴 뒤 system('/bin/sh') 을 실행한다.!
공격!
(공격 성공)
쉘을 획득하였다. :)
'WarGame > 500 Project' 카테고리의 다른 글
(36/500) Lord of the BOF - death_knight (0) | 2017.06.27 |
---|---|
(35/500) Lord of the BOF - xavius (0) | 2017.06.25 |
(33/500) Lord of the BOF - succubus (0) | 2017.06.23 |
(32/500) Lord of the BOF - zombie_assassin (0) | 2017.06.23 |
(31/500) Lord of the BOF - assassin (0) | 2017.06.23 |