분류 전체보기

HackCTF의 ROP 문제다. x86 ROP 공격을 복습할겸 풀어봤다. 바이너리와 libc가 주어져 있다. 바이너리를 실행해보면 입력을 받은 후 그 다음 줄에 "Hello, World!"를 출력해준다. 보호기법을 확인해보면 nx bit만 걸려있다. 문제명 그대로 x86 rop 공격을 해야할 것 같다. main 함수를 ida로 확인해보면 이름부터 취약한 vulnerable_function() 함수를 호출하고 write 함수로 "Hello World"를 출력해준다. 입력은 vulnerable_function에서 받는 것 같다. vulnerable_function을 보면 read 함수를 통해 buf에 0x100만큼 입력을 받는 것을 볼 수 있다. buf의 크기가 0x88인데 0x100만큼 입력을 받으므로 오..
-Virus(바이러스) 정상적인 파일이나 부트 섹터를 감염시켜 악의적인 행동을 하는 것. 주로 저장 매체를 통해 감염된다고 한다. 예를들어 프로그램에 흔히 사용되는 dll 파일을 감염시키거나 운영체제 process 등의 파일을 수정해 복제해버릴 수도 있다. 감염시키기 위해서는 감염시킬 파일들을 수정해야 하므로 파일을 읽고 쓰는 api들이 많이 사용될 것 같다. -Warm(웜) 그 유명한 모리스 웜 악성코드가 해당되는 악성코드 유형이다. 바이러스와 비슷하게 자기 자신을 복제를 하지만 그 대상이 다른 컴퓨터라는 점의 차이가 있다. 이메일, p2p 사이트 등 인터넷이나 네트워크를 통해 확산을하며, 사용자가 이메일이나 p2p에서 해당 악성 파일을 다운 받는다면, 시스템에 해당 악성코드가 설치되고 이 악성코드는 ..
이번에 풀이할 문제는 HackCTF의 RTL_Core 문제다. 문제 파일로는 바이너리와 libc가 주어져 있다. 문제 파일을 실행해보면 Passcode를 입력 받는다. 입력 값을 검증해서 성공, 실패 여부를 결정하는 것 같다. 보호 기법은 nx bit만 걸려 있는 것을 알 수 있다. ida로 main 함수를 확인해보면 입력 값을 bof에 취약한 함수 gets로 받고, 입력 값을 check_passcode 함수의 인자로 전달한 후 리턴 값과 hashcode라는 값과 비교한다. ida에서는 한글이 깨져서 이상하게 나와 있지만, 어쨌든 hashcode와 일치한다면 무언가를 출력해준 뒤, core 함수를 호출해준다. 일치하지 않을 경우 위에서 봤던 "실패!" 문구를 출력해주는 것 같다. 잠만 깨진 문구가 이상하..
HackCTF의 Random Key 문제다. 전에 참여했던 ctf에서 비슷한 유형의 문제를 풀어봤기(삽질했기) 때문에 굉장히 쉽게 풀 수 있었다. 문제 바이너리를 실행해보면 다음과 같이 인증 프로그램이라는 문구가 출력되고 input key 입력을 받는다. 그 후 어떠한 로직을 통해 입력한 키 값이 올바른지 검증 후 결과를 출력해주는 것 같다. 코드는 간단하다. 문구들을 출력하고 scanf로 입력을 받는데(%d로 입력 받는다. 취약점 없다 ㅋㅋ), 입력 받은 값이 rand 함수를 통해 랜덤으로 생성한 값과 일치하다면 flag를 준다. 참고로 이 srand(time(NULL));를 써줬기 때문에 매번 생성되는 값은 랜덤하다. 겉보기에는 취약해보이지 않지만, 들으면 아!하고 무릎을 탁 칠만큼 기발한 공격 방법..
.fini_array overwrite 기법을 공부하다 main 함수가 호출되기 전, 호출되고 종료되기까지의 과정을 정리해봐야겠다는 생각이 들어 작성하게 됐다. -Main 함수 호출 전- 바이너리가 처음 실행될 시에는 ida로 바이너리를 열었을 때 흔히 보게 되는 _start 함수가 호출된다. 이 start 함수는 바이너리 실행 과정에서 필요한 여러 요소들을 초기화하기 위해 __libc_start_main 함수를 호출하게 된다.(__libc_start_main 함수는 libc에 존재하는 함수기 때문에 ida에서는 코드를 볼 수 없다.), void __usercall __noreturn start(__int64 a1@, __int64 a2@) { unsigned int v2; // esi unsigned ..
· CTF
redpwnCTF 2021의 리버싱 문제 wstrings다. 너무 쉽게 풀려서 조금 허무했던 문제다. 문제 파일로 바이너리가 주어져 있다. 문제 파일을 실행해보면 Welcome to flag checker 1.0. 문구와 flag를 달라는 문구가 출력된 후 입력을 받는다. 입력을 받고 바로 종료되는데, 예상을 해보면 올바른 flag를 찾아 입력하면 correct 같은 성공 문자열이 뜰 것 같으니, flag 값과 입력 값을 비교하는 로직을 분석하여 flag 값을 알아내면 될 것 같다. ida로 확인해본 wstrings 바이너리의 main 함수다. wprintf 함수를 통해 "Welcome to flag checker 1.0. Give me a flag> " 문구를 출력하고 fgetsws 함수를 통해 wch..
· CTF
redpwnCTF의 ret2generic-flag-reader 문제다. 바이너리와 소스코드가 주어져 있다. 바이너리를 실행하면 앞서 푼 포너블 문제와 마찬가지로 여러 문구들이 출력되고 입력을 받는다. 마찬가지로 nx bit가 걸려있다. #include #include #include void super_generic_flag_reading_function_please_ret_to_me() { char flag[0x100] = {0}; FILE *fp = fopen("./flag.txt", "r"); if (!fp) { puts("no flag!! contact a member of rob inc"); exit(-1); } fgets(flag, 0xff, fp); puts(flag); fclose(fp);..
· CTF
redpwnCTF의 beginner-generic-pwn-number-0 문제다. 바이너리와 바이너리의 소스코드가 주어져 있다. 바이너리를 실행시키면 여러 문구들이 출력된 후 사용자의 입력을 받는다. 입력을 받은 후에는 아무 동작 없이 프로그램이 종료된다. 보호 기법으로는 nx bit만 걸려있는 것을 알 수 있다. #include #include #include const char *inspirational_messages[] = { "\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"", "\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"", "\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"", ..
· CTF
sanity-check redpwnCTF 2021의 sanity-check 문제다. flag가 그냥 주어져있다. flag{1_l0v3_54n17y_ch3ck_ch4ll5} discord redpwnCTF 2021의 discord 문제다. redpwnCTF 2021 디스코드 서버에 들어가 rules 채널을 확인한다면 flag를 얻을 수 있다. flag{chall3n63_au7h0r5h1p_1nfl4710n} compliant-lattice-feline redpwnCTF 2021의 compliant-lattice-feline 문제다. nc로 주어진 서버에 접속해주면 flag를 준다. flag{n3tc4t_1s_a_pip3_t0_the_w0rld}
-Return Address Overwrite 개념- return address overwrite란 stack frame의 끝에 존재하는 return address 영역을 overwrite 함으로써, 함수가 끝날 때 원하는 주소, 원하는 함수의 코드로 분기를 변경하도록 하는 기법이다. 가장 기본적인 공격 방법이며, 이 공격을 기반으로 rtl, rop 등의 공격이 연계되므로 잘 이해하고 있어야 한다. return address overwrite를 이해하려면 call 명령어와 ret 명령어에 대해서 이해하고 있어야 한다. 먼저 call 명령어는 call 명령어의 다음 주소를 복귀 주소로 stack에 저장한 뒤, 지정한 주소로 이동한다. 여기서 복귀 주소가 저장된 곳이 return address 영역이다. 함..
dyp4r
'분류 전체보기' 카테고리의 글 목록 (3 Page)