CTF & Wargame(REVERSING) 17

[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..

[dreamhack] level1 Recover

바이너리를 실행해보니 "fopen() error"라는 문구만 출력된다. ida로 확인해봐야할 것 같다. 문제를 읽어보니, flag.png 파일에 flag가 들어있고 해당 파일을 암호화한 파일인 encrypted 파일을 복호화하여 flag.png로 복구시켜야 하는 문제 같다.  IDA 분석flag.png 열음실패하면 fopen() error 출력 encrypted 파일 열음실패하면 fopen() error 출력 flag.png를 성공적으로 읽었다면 ptr ^= v6[v5 % 4];ptr += 19;fwrite(&ptr, 1uLL, 1uLL, s);++v5;연산을 수행하여 flag.png를 암호화하고 encrypted 파일에 암호화함 문제 해결 방안v5 = 0;while ( fread(&ptr, 1uLL, ..

[dreamhack] level 1 fake 문제

sub_140B 함수의 반환값을 ptr에 저장만약 ptr의 반환값이 0이라면 1을 반환아래 함수들을 차례대로 실행(인자는 ptr) 해당 바이너리를 실행하면 아무 결과도 나오지 않는다. 따라서 위의 코드를 보면 flag를 생성하고 지우는 작업이 있다는 것을 유추할 수 있다. 그렇다면 마지막의 함수인 free에 bp를 걸고 안에 저장된 값을 확인해보자.해당 바이너리를 PIE가 적용되어있기 때문에 bp를 걸 때 free함수의 주소를 그대로 사용하면 안되고 vmmap을 활용하여 해당 바이너리의 시작주소에 free함수의 주소를 더해준 주소에 bp를 걸어줘야 한다. GDB를 활용한 분석 이제 vmmap으로 바이너리의 시작점을 찾아보자시작점 :0x555555554000 따라서0x555555554000 + free 함..