목록War Game/HackCTF (44)
tmxklab
1. 문제 nc ctf.j0n9hyun.xyz 3020 1) mitigation 2) 문제 확인 3) 코드흐름 파악 3-1) main() int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v5; // [esp+Ch] [ebp-Ch] v5 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { while ( 1 ) { menu(); read(0, &buf, 4u); v3 = atoi(&buf); if ( v3 ..
이후에 힙 관련 취약점을 이용한 문제들이 많으므로 힙 공부를 끝낸 뒤에 풀어볼 예정이다. 1. 문제 nc ctf.j0n9hyun.xyz 3022 1) mitigation 2) 문제 확인 3) 코드흐름 파악 3-1) main() s변수에 입력 값을 받고 바로 포맷 지정자 없이 printf함수로 출력 -> FSB 취약점 발생 v5변수에 get_tier함수 리턴 값을 저장하고 출력 3-2) play_game() 메인 함수 코드에서 사용되지 않은 함수로 해당 함수를 호출하여 파라미터 a1의 값이 4이면 플래그 값 출력 2. 접근 방법 먼저, 메인 함수 코드 흐름상에 play_game함수를 호출하는 로직이 존재하지 않으므로 play_game함수를 호출하도록 해야 한다. 또한, play_game함수의 파라미터로 4..
1. 문제 nc ctf.j0n9hyun.xyz 3019 1) mitigation 2) 문제 확인 제한된 길이의 값만큼 출력 가능 3) 코드흐름 파악 3-1) main() int __cdecl main(int argc, const char **argv, const char **envp) { setvbuf(stdout, 0, 2, 0); return vuln(); } 3-2) vuln() int vuln() { char nptr; // [esp+1Ch] [ebp-2Ch] int v2; // [esp+3Ch] [ebp-Ch] printf("How many bytes do you want me to read? "); get_n(&nptr, 4); v2 = atoi(&nptr); if ( v2 > 32 ) ret..
1. 문제 nc ctf.j0n9hyun.xyz 3038 1) mitigation 2) 문제 확인 [pzshell.c] #include #include #include #include #include #include #include #include void sandbox(void) { scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { write(1, "seccomp error\n", 15); exit(-1); } seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(fork), 0); seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(vfork), 0); seccomp_..
저번에 쉘 코드 작성 실습을 진행했으므로 이번에는 쉘 코드 관련 문제를 풀어보기로 하였다. 1. 문제 nc ctf.j0n9hyun.xyz 3036 1) mitigation 2) 문제 확인 [ezshell.c] #include #include #include #include void Init(void) { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); setvbuf(stderr, 0, 2, 0); } int main(void) { Init(); char result[100] = "\x0F\x05\x48\x31\xED\x48\x31\xE4\x48\x31\xC0\x48\x31\xDB\x48\x31\xC9\x48\x31\xD2\x48\x31\xF6\x48\x31\xF..
1. 문제 nc ctf.j0n9hyun.xyz 3018 1) 문제 확인 - 어떠한 주소 값이 2개 출력되고 입력을 2번 받고 종료 2) main함수 int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+0h] [ebp-84h] alarm(0x3Cu); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); setvbuf(stderr, 0, 2, 0); printf("Hey guyssssssssss here you are: %p %p\n", &binsh, &system); fgets(&s, 128, stdin); printf(&s); gets(&s); return 0; } - ..
1. 문제확인 nc ctf.j0n9hyun.xyz 3017 1) 접속 한 번의 입력을 받고 종료됨 2-1) IDA(Pseudocode)확인 - main() - look_at_me함수를 실행 시킴 2-2) IDA(Pseudocode)확인 - look_at_me() - gets()를 통해 입력을 받음 -> bof 3) $file를 통해 확인 - statically linked -> 정적 라이브러리를 사용함 4) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인 2. 접근방법 look_at_me함수에서 입력 값을 받을 수 있는 gets함수가 존재하므로 look_at_me부터 확인 1) look_at_me() - [ebp-0x18]에 gets의 입력 값을 받는 변수 존재 - 따라서, gets를 통..
1. 문제확인 nc ctf.j0n9hyun.xyz 3016 1) 접속 두 번의 입력을 받고 종료됨 2) IDA를 통해 확인 - 확인 결과 main함수와 sub_400826함수가 가장 눈에 띔 - sub_400826은 fla파일을 화면에 출력해주는 함수로 공격목표에 해당함 2-1) IDA(Pseudocode)확인 - main() - 9~10행 : void형 v3포인터 변수를 16bytes할당해 준 뒤 1을 저장 - 11행 : v3포인터 변수로부터 8bytes떨어진 곳에(QWORD) 8bytes할당 - 12~13행 : void형 v4포인터 변수를 16bytes할당해 준 뒤 2를 저장 - 14행 : v4포인터 변수로부터 8bytes떨어진 곳에(QWORD) 8bytes할당 - 15~16행 : 4096bytes만..
1. 문제확인 nc ctf.j0n9hyun.xyz 3015 1) 접속 패스워드 입력을 받고 성공 유무를 출력해준 뒤 프로그램이 종료 2) IDA를 통해 확인 2-1) IDA(Pseudocode)확인 - main() - gets()로 입력을 받고 입력 값을 check_passcode함수의 인자로 넘겨줘서 hashcode와 비교 - 성공하면 core함수 실행 2-2) IDA(Pseudocode)확인 - core() - ebp로부터 62bytes떨어진 곳에 buf배열 선언 - void *dlsym(void *handle, const char *symbol) : shared library에 포함된 symbol의 위치에 대한 pointer를 찾음 - 즉, 공유 라이브러리에서 printf함수의 주소 값을 찾아 17..
1. 문제확인 nc ctf.j0n9hyun.xyz 3014 1) 접속 key값을 입력하라는 출력창이 뜨고 입력을 받을 수 있는 프로그램 2) IDA(Pseudocode)확인 - main() - time함수에 널 값을 넣어 1970년 1월 1일 0시(UTC 타임존)이후부터 인자 값까지 현재까지 흐른 초 수를 계산하여 v3에 저장하여 반환 - srand함수에 v3인자를 넣어 v3인자를 기반으로 난수를 초기화 - rand함수를 통해 실제 난수 값을 v5변수에 저장 - 사용자의 입력 값을 저장하는 v4와 난수 값이 저장된 v5와 비교하여 참이면 flag값을 보여주며 종료 3) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인 2. 접근방법 1) 사용자의 입력 값의 저장하는 변수와 난수를 저장하는 ..