main()
{
char buf[20];
gets(buf);
printf("%s\n",buf);
}
코드를 보면 setreuid() 함수가 없다.. 따라서 쉘 만 실행하면 level20의 권한을 얻을 수 없다.
따라서 setreuid() 함수 실행 후 system("/bin/sh") 함수를 실행 해야한다.
RTL Chaining 공격 기법을 이용해 문제를 풀어보자!
RTL 공격에서 RET 주소를 변조하여 하나의 공유 라이브러리 함수를 호출 했다면, RTL Chaining 공격 기법은 RTL 공격 기법을 응용하여 여러개의 공유 라이브러리 함수를 호출 할 수 있다.
https://jeongzero.oopy.io/570682fc-ef3e-4d83-9e55-7d28b0ef02dc
자세한건 위 블로그 정독하고 오자!
[그림 1-2] 참고하여 필요한 주소를 찾아보자
passwd 파일을 열어 level20 uid를 확인한다 -> 3100
따라서 setreuid(3100,3100) 되어야 한다.
계산기를 통해 3100(10) -> c1c(16) 알 수 있다.
system(), setreuid() 함수 주소를 찾는다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
long shell;
shell = 0x40058ae0; // system 함수 주소
while(memcmp((void*)shell,("/bin/sh"),8))shell++;
printf("%p\n",shell);
}
위 코드를 이용해 "/bin/sh" 주소를 찾아보자
"/bin/sh" 주소는 0x42127ea4 이다.
objdump -d [파일명] | grep ret -B3
위 명령어를 이용해 pprgadget를 찾는다.
[그림 1-6] 0x0804849d 주소가 pop pop ret 명령을 수행한다.
완성된 payload 를 exploit 해보자
성공!
링크한 블로그를 이해한다면 쉽게 풀 수 있는 문제이다.
다른 방법으로는 setreuid 함수랑 system 함수를 실행하는 shellcode를 직접 만들어 ret에 shellcode 주소를 넣어도 문제는 풀린다.