본문 바로가기

CTF

(53)
codegate 2017 angrybird 이 문제는 z3아님 angr를 쓰라고 만들어놓은거같다.바이너리를 열어보면 exit()함수가 맞이해준다. 우선 바이너리를 수정해서 헥스레이를 사용할 수 있게 하자exit 함수위에 cmp eax, 1로 수정해주고 밑에 call 3개를 nop 처리한다. 이렇게 수정하면 fgets 두번 째 인자가 제대로 안되서 또 다시 수정해준다. 수정 전 수정 후이런식으로 nop처리한다.바이너리를 수정했으면 ida에서 이렇게 보인다.이제 fgets도 작동을 하니 angr를 통해 플래그를 얻어보자123456import angrproj = angr.Project("./test", load_options={'auto_load_libs':False})path_group = proj.factory.path_group(threads=4..
AlexCTF Reverse Engineering https://ctf.oddcoder.com/ 주말에 CTF가 두개씩이나 있어서 이거 문제를 풀다가 다른 CTF로 넘어갔다. 리버싱 50리버싱 50점은 그냥 보면 보였고 리버싱 100리버싱100점은 C++로 제작되었는데이 부분이 배열값에서 정해진 리스트대로 값을 뽑는부분인데 어셈코드는 이렇다 위에 aL3t_me~~~~이 문자 배열에서 밑에 저 리스트 0x36 0x65등등 이런값으로 값을 불러온다 근데 잘 안되가지고 일일이 하나씩 찾았다. 1234567891011121314151617181920212223242526272829303132333435a = "L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0w..
BITSCTF Riskv and Reward 리버싱 20점은 러버덕 펌웨어 파일이 주어졌는데 어떻게 해야하는지 아예 몰라서 못풀었다. 그래서 80점 자리만 잡고있었는데 elf 64비트 파일이 주어졌다. 아이다로 열어봤더니 안열리고 실행도 안됬다.계속 구글링만하다가 게싱을 해보자는 생각으로 헥스에디터를 실행했다. 바이너리 용량이 얼마 안되서 천천히 내려보았다. 가장먼저 눈에 띄는건 위의 문자열이다.해당 문자열을 보면 플래그를 섞어놓은것 처럼 보이는데 BITSCTF{}이걸 추측할 수있다.이 문제는 Alex 리버싱 100점이랑 비슷한데플래그를 뽑으려면 alex처럼 리스트가 있어야 할거같았다.그래서 BITSCTF를 배열에서 찾아보면 B = 0x28, I = 0x21 이런값이란걸 알 수 있다.이걸 헥스에디터에서 검색했더니 저 배열 바로 밑에 리스트가있었다...
insomnihack CTF bender_safe mips 아키텍처인걸 알 수 있는데 헥스레이가 안되니 직접 동적 디버깅을 통해 분석을 해야한다. 프로그램을 실행하면 OTP라고 뜨면서 랜덤값을 준다 이 값에 대한 문자열을 보내면 flag를 얻을 수 있다. vaildate함수를 보면 이 함수를 통과해야하는데이 함수를 분석해서 소스를 한번 짜봤다 123456789101112131415161718192021222324252627282930313233343536373839# -*- coding:utf-8 -*-text = raw_input("text: ")arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" result = ""result += text[0]result += text[-1]if ord(text[7])
Plaid ctf prodmanager 보호 기법은 NX와 ASLR이 걸려있다. 프로그램 실행모습 1 제품 생성2 제품 삭제3 제품 매니저에 등록4 제품 매니저에서 가격이 제일 낮은거 3개 출력 후 삭제5 프로파일 보여주기 메인 부분 - 입력한 것을 스위치 구문으로 표시했다. 제품명과 가격을 적고 malloc으로 76만큼 할당한 곳에 복사하고 링크드리스트를 설정한다. 제품을 3개 등록해야하니3개 등록하고 매니저에도 ADD해서 4번으로한번보면위처럼 나오게 된다. 이 때 매니저에 등록하고 2번으로 지우게 되면 위처럼 가격이 바뀌는걸 볼 수 있다. 그리고 2번에서 free한 것을 5번에서 다시 malloc 하기 때문에 use-after-free 취약점이 발생한다. create에서 malloc을 한 후 이 함수를 호출하는데 나머지를 0으로 초기화하고..
codegate 2014 angry doraemon nuclear와 비슷한 문제라는 얘기를 듣고 한번 풀어볼려했는데 ssp걸려있다. 하지만 그냥 풀어보자 우선 처음 4번을 누르면 위와같은 함수로 진입하게 되는데 read함수에서 buf크기보다 많은 사이즈를 입력받게 되면서 취약점이 발생한다.nuclear와 다른점은 passcode를 릭하는 대신 canary를 릭해야한다.fork()함수 덕분에 canary값이 고정이 되는데 밑에 You choose에서 알아낼 수 있다. buf의 위치는 bp-16임으로 v8과는 0xA만큼 떨어져있다.즉 값을 10개 넣어주면 알 수 있을거라 생각했는데 11개를 넣어야한다.sprintf는 null값을 만날 때 까지 출력을 하므로 보면 canary의 마지막 바이트가 null인걸 알 수 있다. 1234567891011121314151..
Warm-Heap 문제는 간단하다. malloc으로 할당한 후 fgets로 2번 입력받아서 2번 복사를 한다. 처음 malloc을 할 때 힙 상태는 이렇다. 총 4번의 malloc을 마치면 위처럼 주소가 등록된다. fgets로 입력받아서 넣는다. 입력받았던걸 위에 복사한다. 두번째 fgets를 받는다. (처음 받은 곳이랑 같은 위치) 두번째 복사는 malloc에서 가르치는 곳에 해당 주소를 복사한다. 그럼 첫번째 입력에서 "A"를 40개 넣고 exit의 주소를 넣는다. (마지막에 exit함수를 호출하니..)두번째 입력에서는 exit에 복사될 함수의 주소를 입력한다. 여기 flag를 읽는 함수가 있다. 123456789101112131415from struct import *from socket import * p = la..
codegate 2014 nuclear 이 바이너리는 따로 nc서버 설정을 안해도 바이너리 자체에서 소켓 통신을 한다. 고로 바이너리 실행 후 포트를 1129로 연결해주기만 하면된다. 서버에 있는 THIS_IS_NOT_KEY_JUST_PASSCODE를 읽어 들인다. (직접 파일을 만들고 문자열을 집어 넣어 세팅해준다.)실제 대회에서는 문자열이 뭔지 모르기 때문에 릭을 통해 알아내야한다.처음 입력은 quit와 target launch등 입력할 수 있다. s를 알아내야하는데 s1에서 0x200만큼 입력할 수 있다.v4와 v5를 다 채우면 s를 릭할 수 있는데 0x200으론 v4와 v5를 채울 수 없다. 마지막 부분에 이런 부분이 있다. 여기를 활용해 릭해보자. 이부분을 이용하면 v4와 v5를 채울 수 있으니 소스를 짜보면 1234567891011..