$ Capture The Flag $

angstrom CTF 2020 write up

ws1004 2020. 3. 15. 00:25

REV

 

Revving Up

 

해당 첨부 파일을 실행 해서 문제를 실행해 보면 아래와 같습니다.

argument에 banana가 있어야 한다고 합니다.

banana 를 argument에 넣어서 다시 실행해 보겠습니다.

Flag 출력하는 부분 까지 출력된 것을 확인 할 수있습니다.

Shell 을 이용해서 해당 파일을 실행해서 Flag를 얻어 보겠습니다.

Flag : actf{g3tting_4_h4ng_0f_l1nux_4nd_b4sh}

 

 

Windows of Opportunity

 

첨부된 파일을 IDA에 넣어 보면 아래와 같은 문자열을 확인 할 수 있습니다.

Flag가 평문으로 변수에 저장되어 있는 것을 알 수 있습니다.

 

Flag : actf{ok4y_m4yb3_linux_is_s7ill_b3tt3r}

 

 

Taking Off

 

첨부 프로그램을 실행해 보면 아래와 같이 바로 문자열만 출력하고 끝나는 것을 알 수 있습니다.

IDA로 확인해 보면 아래와 같습니다.

argument 를 먼저 맞춰야 if문을 벗어 날 수 있습니다.

argc의 값이 5개여야 합니다.

argv[0] 은 ./taking_off 일것이고 argv[1]~argv[3] 까지 문자를 숫자로 변환을 하는데 아래와 같은 수식을 맞춰야 합니다.

100 * v5 + 10 * v4 + v6 == 932 이어야 합니다.

 

v4 = 3, v5 = 9, v6 = 2 이라는 것을 알게 되었고, argv[4]에는 chicken 이라는 문자열이 들어가야 합니다.

argv 값을 잘 넣어서 실행을 해보니 

비밀 번호를 입력해야 하는것 같습니다.

IDA 디컴파일 소스코드에서 for문 부분을 확인해 보면 xor을 하는 것을 확인 할 수 있습니다.

해당 값을 알 아 보기 위해서 python script를 작성해 보겠습니다.

결과는 please give flag 입니다.

 

Shell 에서 파일을 실행해 보겠습니다.

Flag : actf{th3y_gr0w_up_s0_f4st}

 

 

Patcherman

 

해당 문제파일을 실행해 보면 아래와 같이 무한루프에 들어가는 것을 알 수 있습니다.

IDA를 이용해서 디컴파일 코드를 확인해 보겠습니다.

위의 코드중에서 ptrace 함수 때문에 if 문이 참값이 되서 while(1) 함수에 들어가게 됩니다.

 

해당 프로그램을 패치 해야 할 것 같습니다.

풀이에 사용한 패치 프로그램은 r2 입니다.

r2 프로그램은 Radare2 프로그램중 하나입니다.

 

설치 방식은 아래와 같습니다.

이제 r2 프로그램을 이용해서 코드 패치를 진행해 보겠습니다.

 

r2 -w patcherman 을 입력해서 w옵션으로 인해서 write 가 가능합니다.

-w 이 아니여도 -d 는 debug 모드 로 진입할 수 있습니다.

 

aaa 를 입력해서 해당 프로그램의 모듈을 읽어 옵니다.

 

afll은 프로그램에 들어있는 함수들의 주소를 읽어옵니다.

 

pdf @main은 main 함수를 보여주는 명령입니다.

 

위의 코드에서 ptrace 함수 부분을 찾아보면 아래와 같습니다.

0x400752 주소에서 ptrace 함수를 확인 할 수 있습니다.

 

VV @main 명령을 이용해서 그래프 형식으로 코드를 확인이 가능하고, 위의 ptrace 함수와 관련된 그래프를 확인 해보겠습니다.

ptrace 함수를 지나고 je 0x400775 를 통해서 while문으로 들어가게 됩니다.

코드 패치를 통해 True 값을 가지게 해서 0x4007b0로 가게 해야 합니다.

 

이제 pdf @main 명령으로 주소를 확인한 뒤, 코드를 패치를 진행 해 보겠습니다.

0x400766 주소에 있는 je 0x400775 를 jmp 0x400768 으로 패치를 진행해 보겠습니다.

je 0x400775 -> jmp 0x400768 로 패치가 된것을 알 수 있습니다.

 

그리고 변수도 패치를 진행해야 합니다.

0x601050 에 있는 값을 0x1337BEEF 로 변경을 해줘야 합니다.

 

px 명령을 통해서 변수를 확인 할 수 있습니다.

하지만 주소가 0x400500에 위치해 있기 때문에 0x601050을 확인 할 수 없습니다.

px @0x601050 을 통해서 해당 주소에 있는 변수 값을 확인해 보겠습니다.

해당 값을 0x1337BEEF로 패치를 진행해 보면 아래와 같습니다.

패치를 전부 완료 했습니다.

q명령으로 r2 프로그램을 나간뒤에 프로그램을 실행해 보겠습니다.

Flag : actf{p4tch3rm4n_15_n0_m0r3}