SMALL

Wargame/HackCTF 13

[HackCTF] Random_key

[문제] [풀이] 바이너리를 실행해보면 key 값을 입력 받아 인증이 되면 flag를 출력하고 그렇지 않으면 Nah.. 를 출력하도록 되어 있는 것 같다. file 명령어를 통해 64bit 바이너리임을 확인할 수 있고, GOT Overwrite는 가능하지만 shellcode 삽입은 불가하다는 것을 알 수 있다. 코드를 확인해보면 15~17에서 rand 함수를 호출해서 random 값과 입력 값이 일치해야 flag를 출력하도록 되어있다. rand 함수를 그냥 쓸 경우 seed 값이 없어 한 번 설정된 random 값이 실행할 때마다 고정적으로 출력된다. if) 1 2 3 4 5가 처음 rand 함수 실행해서 출력되었다면 다시 실행해도 1 2 3 4 5가 출력된다는 것! 따라서 seed 값을 부여한 sran..

Wargame/HackCTF 2021.08.23

[HackCTF] 1996

[문제] [풀이] 바이너리를 실행해보면 환경 변수를 입력 받아 실행하는 것으로 보인다. file을 확인해보니 64bit 바이너리이다. RELRO가 Partial이고, NX bit가 걸려있는 것으로 보아 쉘코드 삽입은 불가하고 GOT Overwrite는 가능할 것으로 보인다. main함수를 확인해보면 getenv 함수를 통해 입력 값을 받고 있다. * getenv() 함수 char *getenv(const char *name); :환경 변수 값 구함 -> 입력 값에 대한 길이 검증 X BOF 취약점 spawn_shell 함수를 확인해보면 쉘을 실행시켜주고 있다. 즉, getenv 함수로 BOF를 발생시켜 spawn_shell 함수 주소로 ret 주소를 overwrite하면 exploit 할 수 있을 것으로..

Wargame/HackCTF 2021.08.23

[HackCTF] Poet

[문제] [풀이] 바이너리를 실행해보면 1000000점수를 획득해야 flag를 출력할 것으로 보인다. RELRO가 Partial인 것으로 보아 GOT Overwrite가 가능하고, shellcode 삽입은 불가하다. main 함수를 확인해보면 get_poem, get_author, rate_poem 함수를 호출한 후, 점수가 1000000이면 reward 함수를 호출하면서 무한루프를 탈출한다. 각각의 함수들을 살펴보면 get_poem, get_author함수에서는 단순히 gets함수로 시와 작가를 입력받고 있다. 여기서 gets 함수 때문에 BOF를 발생시킬 수 있을 것으로 보인다. rate_poem 함수를 통해 입력 값을 검증하고 있는데, strcmp 함수 속에 있는 local_10이 poem 값인 것..

Wargame/HackCTF 2021.08.22

[HackCTF] yes_or_no

[문제] [풀이] 바이너리를 실행해서 임의의 숫자를 입력하면 system+1094를 실행해보라는 메시지와 함께 종료된다. -> do_system+1094는 2.27 glibc 버전에서 system 함수 내에서 발생하는 오류 -> rsp 값이 16바이트로 채워져 있지 않으면 do_system+1094에 존재하는 명령어에서 오류 발생(gadget를 잘 넣어야 한다~~!) gdb 분석 전 보호 기법부터 확인해보면 다음과 같다. NX bit가 걸려있는 것으로 보아 쉘코드 삽입은 불가해보인다. 또한, RELRO 가 Partial이므로 data, stack, heap 영역이 읽기 권한만 가진다는 것을 알 수 있다. -> Got Overwrite를 떠올릴 수 있다! 그리고, ldd 명령을 통해 ASLR이 걸려있음을 ..

Wargame/HackCTF 2021.08.15

[HackCTF] BOF_PIE

[문제] [풀이] 문제 파일을 실행해보니 j0n9hyun 의 주소를 알려주고 종료가 되고 있다. 또한, 일정 값 이상 입력 시 버퍼 오버플로우가 발생하고 있다. 그런데, 주소 값이 계속해서 바뀌고 있으며 주소의 뒷자리 0x909는 고정되고 있었다. 이에 ida로 분석해보니 j0n9hyun 함수는 0x890이었지만, welcome 함수가 0x909인 것으로 보아 프로그램 실행 시 제공되는 주소는 welcome 함수의 주소인 것을 알 수 있다. checksec으로 보호기법을 확인해보니 문제 이름 처럼 PIE 보호 기법으로 인해 주소 값이 랜덤으로 바뀌는 것을 알 수 있다.(ASLR과 유사) gdb를 통해 함수를 확인해보니 j0n9hyun, welcome, main함수에 집중하여 보면 될 것 같다. main ..

Wargame/HackCTF 2021.07.26

[HackCTF] Offset

[문제] [풀이] 문제의 바이너리를 실행하니 일정 개수의 문자열을 입력한 후에는 버퍼 오버플로우가 발생하는 것을 확인할 수 있었다. 보호 기법을 확인하니 ret 주소를 이용한 exploit이나 shellcode를 삽입할 수 없었다. 이에 gdb를 실행하여 함수 목록을 확인해보았다. 함수 목록을 확인하니 two, print_flag, one, select_func, main 함수가 눈에 띄였다. print_flag에서 flag를 획득할 수 있을 것 같고, main을 제외한 다른 함수들이 특이하여 살펴보았다. 먼저 main함수를 보니 main(){ setvbuf(); puts("Which function would you like to call?"); gets(&s); select_func(&s); retu..

Wargame/HackCTF 2021.07.25

[HackCTF] Simple_Overflow_ver_2

[문제] [풀이] 바이너리를 실행해보면 입력 값에 대해 버퍼에 저장하여 주소와 함께 출력해주는 것을 확인할 수 있다. 주소는 실행할 때마다 바뀌고 있어 버퍼에 대한 값은 pwntool로 받아서 사용해야 할 것 같다. 보호 기법을 확인하니 NX 가 disabled 되어 있어 쉘코드를 작성할 수 있음을 확인할 수 있다. main 함수를 확인하니 꽤나 긴 흐름을 확인할 수 있었는데, 주요 함수들을 위주로 정리해보면 다음과 같다. main+61: Data : 출력 main+66: ebp-0x88 주소를 가져옴. main+76: %s로 문자열을 입력 받을 것을 의미함. main+83: scanf 함수 호출 -> 사용자의 입력 받음 main+88~232: 주소 값과 함께 사용자가 입력한 문자열을 1바이트 단위로 보..

Wargame/HackCTF 2021.07.25

[HackCTF] x64 Simple_size_BOF 문제 풀이

[문제] [풀이] 프로그램을 실행시켜 보니 buf 의 주소가 매번 바뀌고 있었다. 이에 gdb를 실행시켰다. info func 명령으로 함수 목록을 보니 특별하게 주어진 함수는 존재하지 않았다. main 함수를 확인하였고, 분석한 코드는 다음과 같다. 더보기 main+18~36: setvbuf 함수 호출 main+41~46: "삐빅- 자살방지 문제입니다." 출력 main+51~71: buf 주소 출력 (rbp-0x6d30의 주소를 가져옴) main+76~91: 사용자 입력값 rbp-0x6d30에 저장 main(){ setvbuf(0, 2, 0); puts(); ->"삐빅- 자살방지 문제입니다." printf("buf: %p\n", rbp-0x6d30); gets(); ->rbp-0x6d30에 저장 이에 ..

Wargame/HackCTF 2021.07.17

[HackCTF] x64 Buffer Overflow 문제 풀이

[문제] [풀이] 64bof_basic 파일의 보호기법과 파일 형태를 확인하니 이전과 달리 64비트로 구성되어 있었다. NX 또한 enabled 상태로 쉘코드를 삽입하는 것은 불가능하다. 이에 gdb를 확인해보았다. info func 명령으로 함수 목록을 확인하니 callMeMaybe라는 함수가 눈에 띄었다. 해당 함수를 disassemble 해봤고, callMeMaybe+8에서 /bin/bash로 쉘을 실행하는 것을 알 수 있었다. 이에 callMeMaybe 함수를 이용해 exploit 할 수 있음을 알 수 있었다. 이후 main 함수를 확인하니 코드가 다음과 같이 구성되었다. 더보기 main+24 : scanf 로 입력 받는 값을 저장할 공간 할당 main+44 : scanf 함수 호출 main+49..

Wargame/HackCTF 2021.07.17

[HackCTF] 내 버퍼가 흘러넘친다!

[문제] [풀이] 먼저, prob1 파일을 실행해보면 간단하게 name과 input을 받는 프로그램이라는 것을 알 수 있다. 보호기법을 확인하니 NX가 disabled 되어 있어 쉘코드를 삽입할 수 있다! gdb를 실행시켜서 main함수를 살펴보았다. 코드해석(접은 글) 더보기 main+18 : setvbuf 함수 호출 main+31 : printf 함수 호출 (Name : ) main+39 : read 함수에 50(0x32)바이트 입력 받음 main+41 : 전역변수인 name의 주소를 넣음 main+48: read함수 호출 -> stdin으로 입력 받은 값을 name에 저장 main+61: printf 함수 호출 (input : ) main+73: gets 함수 호출 -> stdin으로 입력 받은 값..

Wargame/HackCTF 2021.07.17
LIST