본문 바로가기

4-7. 2021-2 심화 스터디/CTF

[2021.11.06] dreamhack, HackCTF reversing, CTF문제풀이

  1. rev-4(dreamhack reversing)

 

실행파일 chall4를 역어셈블러, ghidra를 사용하면 위와 같이 나온다.

여기서 main함수를 찾는다. 

Input된 값(local_118)을 Fun_140001000에서 비교하여 Wrong, correct를 거르는 것을 확인.

Param_1(local_118) + local_18>>4 | ((Param_1(local_118)+local_18)&0xf<<4) != DAT_140003000[Param_1(local_118)]

DAT_140003000[~]의 값

24,27,13,C6,C6,13,16,E6,47,F5,26,96,47,F5,46,27,13,26,26,C6,56,F5,C3,C3, F5, E3, E3

또, Local_18=0이고 루프가 돌아갈 때 마다 1씩 증가된다는 것을 알 수 있다.

(입력값 + local_18 ) >> 4 | ((입력값 + local_18)&0xf<<4) == DAT_140003000[Param_1(local_118)]일때 local_18에 1씩 더해진다.

다음과 같이 나옴

이렇게 하는 이유는 저 코드가 0x42라면 0x24로 뒤집는 코드이기 때문

Flag :  DH{Br1ll1ant_bit_dr1bble_<<_>>}

 

2.rev-6(dreamhack reversing)

rev-basic_6

 

실행하고 임의의 값 입력했을 때 Wrong 출력

 

파일코드를 살펴보기 위해 IDA

if ( (unsigned int)sub_140001000(v4) )

puts("Correct");

else

puts("Wrong");

return 0;

}

IF문에서 sub_140001000(

v4) 살펴보면 될 것 같음

 

키ai[i]==플래그[i]이면 correct

 

 

 

 

 

 

 

 

byte_140003000(플래그),byte_140003020(키)값

 

파이썬 ai[i]=flag[i]

값을 이용하여 파이썬 코드 작성

실행

Replac3_the_w0rld 

 

3. handray (HackCTF reversing)

권한 변경 후 문제 확인

위와 같이 flag를 뛰어넘었다는 출력을 확인할 수 있었음

 

프로그램 흐름을 IDA로 살펴보니 아래와 같았음

처음 실행 후 jnz로 흐름이 갈라지는데, 이때 jnz 구문이 실행되면, 즉 zero가 아니면 jump하여 앞서 살펴본 flag를 뛰어넘었다는 문자열을 출력함

만약 zero라서 jump하지 않으면 다른 흐름으로 진행되는데, jle 구문으로 인해 결과가 작거나 같은 경우 jump하여 무언가의 연산 후 다시 비교문으로 돌아오고, 거짓일 경우 “flag is ~”를 출력하는 것으로 보아 연산을 통해 flag를 생성함을 짐작할 수 있음

 

즉, 처음 실행 시 jnz 구문이 거짓이 되어야 flag 값을 알아낼 수 있음, 이에 gdb를 이용해 jnz에 BP를 걸고 실행함

 

현재 레지스터의 상태를 info 명령어를 통해 살펴보니 IF flag만 1 값을 가진 것을 확인할 수 있음

 

 

이에 ZF도 값을 1로 변경하기 위해 우선 ZF의 값이 위치한 6번째의 값도 1로 변경한 16진수 값을 구함

계산을 통해 구한 0x00000242를 $eflags의 값으로 세팅하고 다시 $eflags 레지스터를 살펴봄

흐름을 바꾸기 위한 ZF가 1 값을 가진 것을 확인할 수 있었음

$eflags의 ZF를 1로 변경하니 아래와 같이 프로그램 흐름이 자동으로 변경됨

 

바뀐 흐름을 이어서 실행하니 flag 값이 출력됨

 

flag: HackCTF{ HotToHanDleC0ldT0H000ld!}

(참고: https://sanseolab.tistory.com/44)

4. home (HackCTF web)

IP를 변조하는 것 같다고 추측.

X-forwarded-For 이라는 IP를 붙이는 헤더를 변조하면 될 것 같다고 생각.

프록시 설정 후 Burp suite 켬

다음과 같이 위조

여기서 127.0.0.1로 바꾼 이유는 localhost IP가 127.0.0.1이기 때문

flag : HackCTF{U5u4lly_127.0.0.1_4ll0w5_y0u_t0_p4ss}











5. LOL (HackCTF web)

 

현재 local이아니며 해당 주소에 flag.php인 것을 보아 플래그와 관련됨

-> local로 flag.php들어가보는 것을 예상

 

일단 just play have fun enjoy the game에 들어가 봄

들어가서 

검색을 해보면 lol 전적검색창인 op.gg에서 사용자 검색이 됨

(해당 검색어는 해당하는 닉네임의 사용자가 없어서 안뜨는 거)







user 검색 창의 소스코드를 확인

 

작동방식--> op.gg 페이지+입력한값

post타입인 것을 확인하고 서버와 관련된 공격을 짐작

일단 url을 조작해보자

url 조작했을 때







다른 사이트에 접근하면 no의 값을 띄움--> url을 조작하지 않고 공격을 시도

SSRF 취약점 이용

@을 이용하여 취약점 발생을 시킴_ @ 이전의 값들이 무시가 되고 그 이후의 값으로 page가 이동이 된다.)

 

 

 

value값을 조작(다른 도메인으로 우회해서 접속)












 

localhaost과127,0,0,1은 필터링되는 듯함

 

 

-->다른 사이트에 접근하거나 도메인을 우회하여 접속했을 때 오류를 띄우고(nono~) localhost나 127.0.0.1이 filtering 되는 듯하다.(nop)

 

즉 op.gg 값이 들어가고 127.0.0.1을 우회 해야 한다.

https://posix.tistory.com/100 (우회 참조)



6. Cookie (HackCTF web)

 

Cookie 값을 확인해보면 :

WlhsS2NGcERTVFpKYWtscFRFTktNR1ZZUW14SmFtOXBXak5XYkdNelVXbG1VVDA5

이를 디코딩 하면 :

ZXlKcFpDSTZJaklpTENKMGVYQmxJam9pWjNWbGMzUWlmUT09

딱히 의미있는 값이 나오지 않아서 다시 디코딩을 진행 :

eyJpZCI6IjIiLCJ0eXBlIjoiZ3Vlc3QifQ==

한번 더 디코딩 : {"id":"2","type":"guest"}

다음과 같은 값을 얻을 수 있었다. 이것을 관리자 권한으로 변경하기 위해 {"id":"1","type":"admin"}로 수정한 후, 다시 인코딩 3번

: e1wiaWRcIjpcIjFcIixcInR5cGVcIjpcImFkbWluXCJ9

: ZTF3aWFXUmNJanBjSWpGY0lpeGNJblI1Y0dWY0lqcGNJbUZrYldsdVhDSjk=

: WlhsS2NGcERTVFpKYWtWcFRFTktNR1ZZUW14SmFtOXBXVmRTZEdGWE5HbG1VVDA5

인코딩한 값을 쿠키로 재전송

하지만 flag값이 반환되지 않고 패스워드 값이 틀렸다는 문구만 출력.

이 부분을 수정.

PHP strcmp 함수 매뉴얼을 보면 strcmp(str1, str2) 를 비교했을 때, str1이 더 크면 양수를 반환하고, str2가 더 크면 음수를 반환, 두 값이 같으면 0을 반환한다. 그런데 strcmp 함수의 두번째 인자가 배열 형식이 되어, strcmp(String, Array[])를 만들면, NULL 을 반환하게 되고, NULL은 0으로 처리되어 결과적으로 True가 됨

PassAdmin을 배열형식으로 변경해주면 True가 되어 flag값을 반환한다.

7. RSA (HackCTF Cryptography)

 

HINT를 클릭하니 위키백과의 ‘RSA 암호’에 대한 결과를 확인할 수 있었음

 

 

문제 해결을 위해 파이썬의 Crypto.Util 패키지를 사용함

(https://pycryptodome.readthedocs.io/en/latest/src/util/util.html)

 

아래와 같이 문제 해결을 위해 패키지 설치 후 파이썬 코드를 작성함

우선 공개키를 위해 p, q를 이용해 N 값을 찾고, (p-1)(q-1)인 phi 값을 찾아냄

이후 공개키를 위해 mod phi에 대한 e의 곱셈의 역원을 구함 (어떤 수 x, y의 곱이 mod phi한 결과가 1이 되기 위해서는 두 수는 서로 역원이 되어야하기 때문임)

이후 구한 값을 통해 복호화 식으로 암호문을 해독, 바이트로 형 변환하여 flag를 찾게 됨

flag: HackCTF{R5A_1s_s0_fun!}