본문 바로가기

Security

HITCON Training lab7 ~ 9 Lab7 #include #include #include #include unsigned int password ; int main(){ setvbuf(stdout,0,2,0); char buf[100]; char input[16]; int fd ; srand(time(NULL)); fd = open("/dev/urandom",0); read(fd,&password,4); printf("What your name ? "); read(0,buf,99); printf("Hello ,"); printf(buf); printf("Your password :"); read(0,input,15); if(atoi(input) != password){ puts("Goodbyte"); }else{ puts("Congrt.. 더보기
BOF 중 scanf에 대한 글 DreamHack에 워게임 문제들을 처음부터 풀어보고 있는데 막힌 부분이 있어서 블로그에 정리한다. NX같은 보호기법도 안걸려있는 전형적인 버퍼오버플로우 취약점의 문제였다. 간단히 페이로드를 [Nop Sled] [Shellcode] [SFP] [RET = Buf's addr] 로 구성하여 exploit을 했다. 처음에는 peda에서 제공해주는 쉘코드를 사용했는데 스택에 쉘코드가 제대로 박히지 않았다. 디버깅을 해봤는데, System Call을 위해 eax를 11(=0xb)로 셋팅하려고 사용한 "push 0xb" 명령어의 기계어인 "6a 0b" 중 "0x0b"가 누락되었다. 테스트해보니깐 입력을 받는 함수인 scanf에서 0xb를 입력값으로 받아들이지 못하고 입력이 종료되버린다. ASCII 코드표를 보면,.. 더보기
HITCON Training lab6 lab6 #include int count = 1337 ; int main(){ if(count != 1337) _exit(1); count++; char buf[40]; setvbuf(stdout,0,2,0); puts("Try your best :"); read(0,buf,64); return ; } 간단한 소스코드다. buf[40] 변수가 있는데 read 함수를 통해 64 길이만큼 입력받아서 BOF 취약점이 발생한다. ROP를 통해 쉘을 획득하려고 했는데 64 크기만큼만 입력할 수 있다는 것이 문제가 생겼다. 일단, puts의 got를 통해 실제 함수를 구하고 offset 계산을 통해 system 함수를 구하는 것까지 했다. 하지만 길이의 제한으로 더 이상 입력할 수 없어서 .bss 영역을 fake.. 더보기
HITCON Training lab4 ~ 5 lab4 #include void See_something(unsigned int addr){ int *address ; address = (int *)addr ; printf("The content of the address : %p\n",*address); }; void Print_message(char *mesg){ char buf[48]; strcpy(buf,mesg); printf("Your message is : %s",buf); } int main(){ char address[10] ; char message[256]; unsigned int addr ; puts("###############################"); puts("Do you know return to library .. 더보기
Oneshot 가젯 One-gadget? 라이브러리 파일 내에서 "/bin/sh"를 실행하는 가젯 대부분 CTF에서 GOT 영역을 덮어쓸 수 있을 경우 사용 One Gadget 찾기 strings, objdump를 통해 구하기 one_gadget 사용 문제풀이 (TJCTF 2016 oneshot) 바이너리 분석 결과, 원하는 주소를 읽어 해당 값을 구할 수 있고 원하는 주소로 점프할 수 있다. 아마 파일명과 같이 Oneshot gadget을 이용하여 문제를 해결하라는 것 같다. 나는 puts의 got를 읽어 함수주소를 구하고 이를 통해 원샷가젯의 주소를 구해 문제를 해결할 계획이었다. 문제를 해결하며 삽질했던 부분은 다음과 같다. Libc Base 주소 구하기 gdb를 통해 파악한 메모리 매핑 중 라이브러리의 Start A.. 더보기
HITCON Training lab1 ~ 3 Lab1 #include #include 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); prin.. 더보기
CODEGATE 2019 컨퍼런스 후기 보호되어 있는 글입니다. 더보기
Code Injection Code Injection Code Injection은 크게 2가지의 의미로 해석될 수 있다. 첫 번째는 소프트웨어의 버그(취약점)의 일종으로 애플리케이션의 신뢰할 수 없는 데이터를 입력받아 악의적인 행위를 수행하거나 코드를 실행하는 것을 의미한다. 두 번째로는 역공학(Reverse engineering, Reversing)에서의 Code Injection이다. 해당 글에서는 바로 후자의 관한 코드 인젝션에 대해 살펴보도록 하겠다. Code Injection은 목적 프로세스에 독립적인 실행 코드를 삽입한 후, 이를 실행하는 기법을 의미한다. DLL Injection과 마찬가지로 보통 CreateRemoteProcess( ) API를 이용하여 실행한다. Code Injection vs DLL Injecti.. 더보기