BOF 원정대의 nightmare를 잡아보자!

* 소스코드


(nightmare.c)


nightmare 특징!
ret 주소에 strcpy를 써야한다는 점.
(이번 문제풀이는 엉뚱땅 삽질을 많이했다. 이 포스트에는 삽질의 과정이 그대로 있습니다. 빠른 해법이 궁금하다면 아래쪽부터!, 초반의 잘못된 판단?생각? 들도 그대로 과정대로 적었습니다.)

strcpy를 통해 쓸만한 영역에다가 system 주소와 /bin/sh 문자열을 구성하여 쉘을 획득하자!
먼저 strcpy 주소를 알아내보자!



(strcpy 주소)



이 주소가 맞는지 한번 체크!



(gdb 실행)



gdb로 실행을 해보니 leave까지 잘 넘어갔다.
그렇다는 것은 ret 주소에 알맞은 주소를 썻다는것!

자 이제 쓸만한 영역을 찾아볼까~


(쓸만한 영역)



스택영역에서 0xbffff714 주소가 눈에 띄였다. 0으로 덮여진 깨끗한 도화지

즉 나는 여기에다가 복사시킬 것이다.

나의 계획!
저 깨끗한 도화지에다가 버퍼를 복사한다. 버퍼에는 system과 인자 구성이 되어있다.
그 후 fake ebp로 0xbffff710 으로 fake ebp를 한다. 그렇다면 0xbffff714 에 있는 system 함수가 호출되게 하여 쉘을 획득하려는 것!

fake ebp를 이루기 위해 leave-ret 주소 찾기



(leave-ret 주소)



그런데 이런생각이 들었다. 스택의 버퍼 주소를 쓰면 스택의 주소는 약간의 오차가 있어서 맞추기가 귀찮다. 그러므로 고정적으로 내 버퍼를 저장해둔 공간이 없을까?
-> printf 로 출력을 하니 출력버퍼가 있을거 같긴하다. (실제로 다른 문제 풀때는 출력버퍼를 이용했었다.)

출력버퍼를 한참 찾다 못찾았지만.. ㅜ strcpy에 내가 적은듯한 것들이 있다? strcpy의 버퍼인가? 무튼 요골 쓰면 괜찮지 않을까?



(좋은것 발견?)



바로 0x400767ea 주소가 strcpy의 버퍼인듯 하다? (그런데 strcpy가 버퍼가 있나?)



(버퍼?)



자 이 주소를 쓰는 거야!



(gdb 실행)



공격 전 메모리를 확인해보자!



(어라?)



이건 뭐지?
-> 아..! 다시 소스코드를 보니 ret 주소 옆에 A로 4개를 덮는다.... (즉 fake ebp 못한다.)
+ 삽질 : strcpy에 버퍼가 어딨어.. ㅜㅜ

아까 본 것은 51... 41(A)가 아닌데.. 착각했다.. (.... )

결국 방향을 바꾸었다.
strcpy로 저 41414141을 덮어쓰자!
바로 system 함수와 + 인자구성으로
그러면 버퍼의 주소 확인하고!


(버퍼주소)



41414141 위치는 core 덤프 파일로 확인하겠다. 어짜피 바뀔거니? (그렇다면 버퍼위치도 core 덤프 파일로 찾지..! ㅎㅎ)

일단 공격


(공격)



덤프 파일로 버퍼부터 찾는다.!



(버퍼 찾기)



찾았다!

이제 41414141로 덮여쓰여지는 ret 다음 주소 찾기!



(41414141 위치)



찾았다!

이제 41414141을 내 system함수 + 인자구성으로 덮어쓴 뒤 system('/bin/sh') 을 실행한다.!

공격!


(공격 성공)


쉘을 획득하였다. :)

+ Recent posts