목록CTF 문제 (10)
tmxklab
1. 문제 확인 올바른 패스워드를 입력받아야 함 2. 접근 방법 main() sub_10B0 : fgets()로 v6에 input size 48만큼 입력을 받는다. check815546()의 파라미터로 들어감 이후에... ..... ... 이런 식으로 계속 check???()안에 또 다른 check???()를 호출한다. 계속 check???()를 호출하다가 마지막에 위에 함수를 호출하고 return한다. 요약하면 입력 값을 검증하기 위해 check???()를 여러 번 호출하고 if문이 참이어야 하므로 일일히 리버싱을 하기에는 시간이 오래 걸린다. 따라서, 바이너리 분석을 위한 파이썬 모듈인 angr모듈을 사용하여 문제를 해결한다. angr은 간단한 조건을 주면 자동으로 무작위 대입을 시작하여 결과를 도출..
1. 문제확인 무슨 자물쇠를 푸는 것 같고 pin 1 ~ 5까지 선택할 수 있는데 나중에 보니 pin은 3 → 1 → 5 → 2 → 4 순서대로 문제를 해결하면 된다. 1) main() int __cdecl main(int argc, const char **argv, const char **envp) { puts("*** WELCOME TO THE SCHLAGE 9000 ***"); puts("*** AUTHORIZED USERS ONLY ***"); LABEL_8: while ( (unsigned __int8)is_lock_unlocked("*** AUTHORIZED USERS ONLY ***", argv) != 1 ) { print_lock(); switch ( (unsigned __int64)(un..
1. 문제확인 1) side-channel.py 1-1) main() main함수에서 init_password()를 통해 password 8자리가 0 ~ f범위를 가진 랜덤 값으로 세팅되고 guess_password()가 두 번 실행된다. 1-2) guess_password() password와 입력 값이랑 문자 1개씩 비교하고 결과가 같지 않으면 0.1 * password[i]의 인덱스 값만큼 sleep된다. 2. 문제 풀이 guess_password()가 두 번 실행되므로 처음 guess_password()에서는 sleep되는 시간을 통해서 password의 값을 유추한다. 그리고 시간 값을 통해서 password의 값을 유추한다. 몇 번 돌리고 나면 실제로 리모트에서는 0이면 0초, 1이면 0.1초..
1. 문제 확인 실행시켜보면 이상한 점이 있다. 원하는 숫자를 입력하라길레 10을 넣었는데 10번 반복되지 않고 6번만 반복되고 종료된다. 1) mitigation 확인 2-1) main() int __cdecl main(int argc, const char **argv, const char **envp) { int number; // [rsp+Ch] [rbp-4h] puts("How many favorite numbers do you have?"); fgets(buffer, 20, stdin); number = atoi(buffer); if ( number > 100 || number > 4); for ( i = 0; (int)i < num; ++i ) { printf("Enter number %d/%..
사실 이 문제는 PIE도 걸려있는데 어떤 주소를 참조해야할 지 몰라서 못 풀었던 문제이다. 대회가 끝나고 다른 사람의 롸업을 보고 정리해야할 필요성이 있어 작성하게 되었다. 해당 문제는 vsyscall영역을 이용하여 익스한다. 1. 문제확인 어떤 것을 call할 것인지 물어보고 입력을 받으면 segmentaton fault가 발생하면서 종료됨 1) mitigation 확인 2-1) main() int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4; // edx void (*call)(void); // [rsp+8h] [rbp-20h] __int64 v7; // [rsp+10h] [rbp-18h] un..
1. 문제 확인 이전 홈페이지 로고가 무지개색이 아니었냐고 하면서 어떻게 작동되는지 궁금해한다. 나도 궁금하다. 그리고 홈페이지 링크와 hint가 주어진다. 2. 문제 접근 먼저 힌트를 보면 8비트 단위로 끊어진 바이너리를 확인할 수 있다. 얼마 안되는 거 같아서 아스키코드표를 참고하면서 열심히 옮겨 적었다... 힌트 내용이 바이너리를 고려했냐고 한다. 이제 홈페이지의 로고가 어떻게 되어있는지 보자 마우스를 가져다 대면 색깔이 변경된다. 하다 보니 재밌어서ㅋㅋㅋ 다 바꿨다. 최종적으로 변경된 모습은 그런데 이거를 가지고 무엇을 할까 하다가 html파일을 확인해보니 각 점들의 좌표?는 cx, cy로 색깔은 rgb로 설정된다. 처음에는 바이너리와 관련되어 있는 문제인 것 같아서 rgb(0,82, 72)인 점..
1. 문제 확인 wav파일이 주어지고 해당 wav파일에 무언가 통신을 한다고 되어있었다. 2. 문제 접근 wav파일을 켜서 들어보면 잡음이랑 이상한 소리만 나온다... wav파일로 어떻게 해야될지 몰라서 구글링하던 중에 스펙트럼에 flag값이 써있는 경우가 있다고 하여 음성 편집기? 툴을 다운받아서 파일을 올려봤다. download link : https://www.audacityteam.org/download/ Download Download Audacity Download the free Audacity audio editor for Windows, Mac or Linux from our download partner, FossHub: Download Audacity for Windows, Mac o..
1. 문제 확인 바이너리 파일이 주어지고 이번에는 플래그 파일의 경로를 알려준다. 1) mitigation 2-1) main() → vuln() void __cdecl vuln() { char name[40]; // [rsp+0h] [rbp-30h] puts("Where would you like to return to?"); gets(name); } 이번에도 gets로 받는다. → bof쌉가능 2-2) setup() → sandbox() void __cdecl sandbox() { sock_fprog prog; // [rsp+0h] [rbp-10F0h] sock_filter filter[25]; // [rsp+10h] [rbp-10E0h] bpf_labels lab; // [rsp+E0h] [rbp-1..
1. 문제확인 바이너리 파일이 주어진다. 1) mitigation 확인 2) main() → vuln() __int64 vuln() { char v1; // [rsp+0h] [rbp-30h] puts("Where would you like to return to?"); return gets(&v1); } 카나리도 안걸려있고 gets()로 bof쌉가능 2. 문제 풀이 pop rdi; ret가젯이 없는 줄 알고 rtc로 gets주소 릭하고 하위 1.5바이트로 libc찾아냄 하위 3비트 : 0x0b0 libc 다운받아서 원샷 가젯을 찾음 원샷 가젯 실행하면 된다. 1) 익스코드 from pwn import * #context.log_level = "debug" #p = process("./return-to-w..
해당 문제는 python jail 또는 Pyjail관련 문제이다. 1. 문제확인 먼저, 서버에서 작동되는 python파일을 확인해보자 #!/usr/bin/env python3 from base64 import b64decode import blacklist # you don't get to see this :p """ Don't worry, if you break out of this one, we have another one underneath so that you won't wreak any havoc! """ def main(): print("EduPy 3.8.2") while True: try: command = input(">>> ") if any([x in command for x in bl..