-
[HackerSchool] Level13오래된/HackerSchool 2011. 5. 10. 03:55
[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);
}
}[ level13 hint ]
이 문제는 Buffer Overflow 공격을 막기 위해 dummy 공간을 이용 exploit code 를 이용한 무분별한 공격을 더디게 만들어주었던 것처럼 이 문제에서 말하려는 security cookie 역시 이와 같은 형태로 만들어지게 되었다.
이것은 함수시작시 ebp 다음에 security cookie 를 생성하여 push 한 다음 leave 명령이 실행되기 이전에 함수 실행시 저장해둔 security cookie 값이 처음값과 변함이 없는지 즉, buffer overflow 공격이 발생하지 않았는지를 검증하기 위한 용도로 사용 된다. 하지만, 이 값은 컴파일시 생성되는 값으로 변함이 없기 때문에 쉽게 회피가 가능하게 되었다.
이전 문제들과 다른점이라면, 정확한 변수 i 의 위치를 계산해야 한다는 점이다.
[level13@ftz tmp]$ gdb -q ./attackme
(gdb) disas main
Dump of assembler code for function main:
0x080484a0 <main+0>: push %ebp
0x080484a1 <main+1>: mov %esp,%ebp
0x080484a3 <main+3>: sub $0x418,%esp
0x080484a9 <main+9>: movl $0x1234567,0xfffffff4(%ebp)
...[중략]...[ attackme 코드 ]
gdb 를 이용해서 assm 코드를 보면 변수들을 위한 공간으로 0x418(1048) byte 를 할당 하는 것을 볼 수 있다.
이 때, 메모리 구조를 살펴 보면 아래와 같을 것이다.
[ buf(1024) ][ dummy(12) ][ i(8) ][ dummy(4) ][ ebp ][ ret ]
위와 같을 것이다.
따라서 의미없는 값 으로 앞 1036 byte 를 채우고 뒤에 12 byte 를 0x1234567 로 채운뒤 ret 위치에 이전에 했던 방식처럼 환경변수에 쉘을 올려놓고 그 주소값을 넣어주면 공격이 성공하게 될 것이다.
'오래된 > HackerSchool' 카테고리의 다른 글
[HackerSchool] Level15 (0) 2011.05.10 [HackerSchool] Level14 (0) 2011.05.10 [HackerSchool] Level12 (0) 2011.05.06 [HackerSchool] Level11 (0) 2011.04.29 [HackerSchool] Level10 (0) 2011.04.29