분류 전체보기 80

[dreamhack] level 2 basic_exploitation_000

문제 분석buf = ( 뒤에 랜덤한 주소가 출력되고 AAAAA를 입력하면 아무런 동작을 하지 않는다. 따라서 AAAA를 엄청나게 많이 입력해보았더니 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. basic_exploitation_000.c 파일 확인#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30);}int main(..

[dreamhack] Return Address Overwrite

문제 분석해당 문제에 AAAAA 라고 입력해보면 아무 동작도 하지 않는다. 하지만 A를 64개 정도 입력해보면 Segmentation falut라는 에러가 뜨고 core 파일이 위와 같이 생성된다.  코어 파일 분석gdb로 core 파일을 확인해보면 버퍼오버플로우로 인해 버퍼의 크기를 초과하여 반환 주소를 0x4141414141로 덮어쓴것 같다. 따라서 return address를 변조하면 될 것 같다.rao 파일 분석스택 프레임 구조를 파악하기 위해 rao를 분석해보니 위와 같은 어셈블리 코드를 확인할수 있었다.사용자의 입력이 들어갈 버퍼의 위치는 rbp-0x30이다. 이후에는 sfp가 저장되고 rbp+0x8엔 ret address가 저장된다.  따라서 버퍼의 위치와 반환 주소 사이에는 0x38만큼의 ..

[dreamhack] Beginner shell_basic

문제파일을 실행하면 위와 같은 결과를 얻을수 있다. shellcode를 통해 flag를 찾아야 한다. 문제 분석shell_basic.c 파일을 보면 main 함수에서 banned_execve() 함수가 있는 것으로 보아 execve 셸코드를 통한 공격은 막아 놓은 것 같다. 따라서 orw 셸코드를 작성하여 공격을 해보자 익스플로잇위와 같이 orw 셸코드를 작성해주었다. 문제에서 flag 파일의 위치와 이름은 "/home/shell_basic/flag_name_is_loooooong" 라고 했으니, /home/shell_basic/flag_name_is_loooooong을 리틀 앤디언으로 변환해주고 orw 셸코드를 셸코드 강의에서 배웠던 것과 똑같이 작성해주었다. 그리고 작성한 셸코드를 opcode 형태로..

[dreamhack] level2 ez_rev

해당 파일을  실행하면 특정 값을 입력할수 있고, 입력을 마치면 KKKK라는 문자열이 출력된다.  IDA 분석main 함수를 디컴파일 하면 위와 같은 코드를 확인할수 있다. 1. 사용자에게 입력을 받고 입력받은 값을 _0에 저장2. 사용자의 입력값을 특정 연산을 통해 변환함3. v12의 문자열과 비교4. (!v8 && !v9) == v8  조건을 만족하면 Correct 출력 ida에서 off_4E50F0의 값을 확인하면 "qksrkqs"가 저장되어 있는 것을 확인할수 있다. 사용자가 입력한 값을 변환한 값이 "|l|GHyRrsfwxmsIrietznhIhj"와 일치해야 한다.따라서 변환된 값이 |l|GHyRrsfwxmsIrietznhIhj가 되려면 어떤 값을 입력해야하는지 알아내야한다. 따라서 flag를 ..

[dreamhack] level 1 Check Function Argument

main 함수를 디컴파일 하면 위와 같은 코드가 나온다. 문구를 살펴보니 puts문 아래의 함수의 파라미터에 flag가 존재하는듯하다. 따라서 해당 함수의 주소에 bp를 걸고 gdb를 통해 디버깅을 시도해봤다. sub_4015E2 함수 주소 : 0x00000000004015E2 b *0x00000000004015E2 위의 실행 결과에서 알 수 있듯이Flag is DH{63db030352ca9f9f5e6b8a59c0527bee}'이렇게 flag가 출력되는 것을 확인할 수 있다.

[dreamhack] level1 Small Counter

해당 바이너리를 실행하면 위와 같은 숫자들이 출력된다. IDA 분석위의 코드를 확인해보면 [rbp+var4]의 값이 5와 같아야 "Nice!"라는 문구를 출력한다. 따라서 [rbp+var4]의 값이 5와 같아지도록 gdb를 활용하여 수정해야한다. pwndbg 디버깅일단 cmp [rbp+var4], 5가 있는 주소로 이동해야 한다. ida에서 해당 주소를 확인해보면 0x00000000000015AA인것을 알 수 있다.디버깅을 하기 앞서서 checksec 명령어를 통해 PIE 여부를 확인해보면 PIE가 enabled 되어 있는 것을 확인할 수 있다.따라서 vmmap을 통해 해당 바이너리의 시작점을 확인한다. 따라서 0x00000000000015AA + 0x555555554000를 연산한 주소에 bp를 걸어준..

[dreamhack] level 1 Easy Assembly 문제

해당 파일을 실행하면 다음과 같은 문구가 출력된다. ./prob을 하고 값을 넣으라고 해서 아무 문자나 넣어봤는데 아래와 같은 문구를 출력해주는걸로 봐선 올바른 key값을 찾아야 하는 것 같다. IDA 분석 eax : 사용자 입력값len : 사용자 입력값 길이esi : 사용자 입력값edi : enc_flag 값ecx와 ecx xor 연산check_pw 함수 실행eax 와 0 비교0이면 flag 출력a2 변수에 enc_flag++ ^ len ^ v0++ 연산을 한 값을 or 연산하여 저장len이 0이 될 때까지 반복a2를 반환 exploit 코드enc_flag = [ 0x74, 0x78, 0x4B, 0x65, 0x77, 0x48, 0x5C, 0x69, 0x68, 0x7E, 0x5C, 0x79, 0x7..

[dreamhack] level1 legacyopt 문제

legacyopt 바이너리를 실행하면 입력할 수 있는 칸이 나온다. 입력을 하면 7912394e5c 와 같은 특정한 문자열을 출력해주는 것을 확인할 수 있다.그리고 같은 디렉터리에 저장되어 있는 output.txt를 확인해보면220c6a33204455fb390074013c4156d704316528205156d70b217c14255b6ce10837651234464e라는 문자열이 저장되어 있다. IDA 분석사용자에게 입력받은 값을 s에 저장v3에 입력값의 길이를 저장 ptr, s, v3를 인자로 하는 sub_1209함수 실행s의 길이만큼 반복ptr[i]를 출력 sub_1209 함수 분석unsigned __int64 __fastcall sub_1209(_BYTE *ptr, char *input, int inp..