CTF write_up/Hack CTF
-
[Pwn] g++ pwnCTF write_up/Hack CTF 2019. 9. 24. 00:29
파일을 실행해 보겠습니다. checksec 명령어로 보호기법 및 파일의 비트를 확인하겠습니다. 32bit 이면서 딱히 보호기법을 인지 할 필요는 없는것 같습니다. IDA 32bit으로 열어보겠습니다. vuln함수의 디컴파일 코드인데, 특별히 보이는 문자열및 함수를 체크해 봤습니다. s변수의 크기는 아래와 같이 0x3C입니다. 0x3C == 60 변수의 크기는 60인데 입력은 32 만 받기 때문에 일반적인 방법으로는 RET 를 덮지 못할 것 같습니다. replace 변수가 있는데 "I" 를 "you"로 변환 시킵니다. 그러면 I를 21개 넣고 A 한개를 넣으면 s[60]+SFP[4] 인 64를 가뿐히 덮을 수 있습니다. 그리고 함수를 보시면 get_flag 라는 함수가 있어서 ret에 주소를 넣으면 될 것..
-
[Pwn] BOF_PIECTF write_up/Hack CTF 2019. 9. 24. 00:28
문제를 해결하기 위해서 실행을 해보겠습니다. 문제 제목에서도 BOF_PIE 인것 으로 보아 PIE를 이용해야 할 것 같습니다. checksec 명령어로 확인해 보겠습니다. PIE : PIE enabled 라고 되어 있습니다. PIE 보호 기법 때문에 주소가 바뀌기 때문에 base주소를 알아야 합니다. 이점을 유의해서 문제를 풀어 보겠습니다. IDA 32bit 로 열어보겠습니다. welcome 함수로 넘어갑니다. v1이라는 변수에 입력을 받고 main으로 넘어가 프로그램이 종료 됩니다. 함수를 살펴 보던중 다음과 같은 함수를 발견했습니다. 어딘가에 해당 함수 주소로 변조하면 될 것 같습니다. PIE는 주소값이 전부 상대적으로 표시 되어 있기 때문에 실행시 입력되어 지는 값을 가지고 실제 주소를 찾아야 합니..
-
[Pwn] OffsetCTF write_up/Hack CTF 2019. 9. 24. 00:27
해당 문제를 한번 실행해 보겠습니다. checksec 명령어를 한번 입력해 보겠습니다. IDA 32bit를 이용해서 열어보겠습니다. gets 함수가 보이므로 bof 문제네요! select_func함수로 입력한 변수 s의인자를 같이 전달 합니다. 전달받은 값을 dest 변수에 넣고 그 값이 one 이면 v3의 값을 one 함수로 보내는 기능을 하는 코드 입니다. select_func함수의 변수 stack 모형을 한번 그려 보겠습니다. |----------------| | dest [ebp-2A] | == src |----------------| | v3 [ebp-C] | |----------------| | SFP [ebp-0] | |----------------| | RET [ebp+4] | |-----..
-
[Pwn] x64 Simple_size_BOFCTF write_up/Hack CTF 2019. 9. 24. 00:25
문제를 해결하기 위해서 ida 64bit로 열어보겠습니다. main 하나만 있는 문제인것 같습니다. 취약한 부분은 gets함수 부분이고, v4의 포인터 값을 출력해 주는 것으로 보아 stack의 시작 주소를 주는것 같습니다. 페이로드는 다음과 같이 짜면 될 것 같습니다. 쉘코드 + dummy값 + RET에 buf 시작 주소 buf의 크기를 한번 보겠습니다. 0x6D30... 좀 크네요! => 27,952 입니다. 이 내용을 토대로 Exploit code를 작성해 보겠습니다. Flag : HackCTF{s000000_5m4ll_4nd_5m4ll_51z3_b0f}
-
[Pwn] Basic_FSBCTF write_up/Hack CTF 2019. 9. 20. 20:49
해당 문제는 앞서 풀어본 문제들과 달리 FSB 즉, Format String Bug의 약자로 버퍼 오버 플로우 해킹 기법중 하나라고 합니다. IDA에 넣어서 값을 확인해 보겠습니다. vuln함수가 있네요 들어가 보겠습니다. FSB에 취약한 부분은 printf를 포맷없이 사용한 위사진의 밑줄 부분입니다. 그리고 함수를 보면 flag 함수가 존재 합니다. flag 함수의 주소를 취약한 부분에 넣어야 하는것 같습니다. 각각의 함수에는 PLT영역과 GOT영역이 있습니다. 따로 포스팅 할 계획이지만 간단히 이론만 설명하고 넘어가겠습니다. PLT : Procedure Linkage Table의 약자로, 외부 프로시저를 연결해주는 테이블, PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해서 사용할 수 있습니다...
-
[Pwn] x64 Buffer OverflowCTF write_up/Hack CTF 2019. 9. 20. 02:27
문제를 해결하기 위해서 IDA 64bit에 넣어서 확인해 보겠습니다. 특이점이 없어서 shellcode를 넣는 문제인가를 확인하다가 다음과 같은 함수를 찾았습니다. RET에 callMeMaybe 함수의 주소를 넣으면 될것 같습니다. 입력되는 변수인 s의 크기는 다음과 같습니다. 0x110 = 272입니다. SFP와 RET를 구해보겠습니다. SFP : 8 // RET : 8 Exploit code는 아래와 같습니다. Flag : HackCTF{64b17_b0f_15_51mpl3_700}
-
[Pwn] Simple_Overflow_ver_2CTF write_up/Hack CTF 2019. 9. 20. 02:26
문제를 해결하기 위해서 IDA 32bit에 넣어보겠습니다. 일단 취약한 함수는 먼저 입력 받는 scanf에 있는 것 같습니다. 그리고 printf("%p : ", &s[i])인것 으로 보아 입력값인 stack 의 주소를 주는것 같습니다. 해당 주소를 RET에 넣으면 될 것같습니다. s의 크기를 알아보겠습니다. 0x88 => 136 입니다. SFP와 RET의 크기도 한번 알아 보겠습니다. SFP : 4 // RET : 4 입니다. Exploit code는 아래와 같습니다. Flag : HackCTF{y0u_d1d_7h3_45516nm3n7_5ucc355fully!}
-
[Pwn] 내 버퍼가 흘러넘친다!!!CTF write_up/Hack CTF 2019. 9. 20. 00:47
해당 문제에 대해서 IDA 32bit 으로 Decompile 해보겠습니다. 0x32 크기의 name 변수에 값을 read 함수를 통해 입력하고, s라는 변수에 get함수를 사용하고 있습니다. get함수에서 BOF 취약점이 일어납니다. 변수 s의 크기는 0x14 입니다. 이는 name 변수에 쉘코드를 넣고, s변수의 ret의 값에 name의 주소를 넣어서 쉘코드를 실행 하는 식으로 하면 될 것 같습니다. 변수 s의 구조 : 변수 공간(0x14) + SPF(0x4) + RET(0x4) python pwntools 를 이용해서 한번 코드를 작성해 보겠습니다. Flag : HackCTF{1_l0v3_70p_pwn3r_m4lhyuk}