감자 텃밭

rtl_core 본문

my_study/HackCTF

rtl_core

g2h 2021. 7. 21. 00:03

rtl_core

이번에 풀어본 문제는 hackCTF의 rtl_core다 이번 문제도 제목에서 유추 가능한 rtl을 이용한 문제이다

 

해당 프로그램을 일단 실행시켜보자

passcode라는것을 입력받게 되어 있다. 음.. 해당 문제는 아마 ASLR과 NX가 기본적으로 적용되어있을 거 같은데

일단 확인해보았다.

적용된 메모리 보호기법

역시나 그렇듯 NX가 설정되어있다 ASLR도 설저되어 있을 것이다.

 

일단 해당 문제를 명확히 분석하기 위해 IDA를 통해 확인해보았다.

 

메인 함수를 살펴보면 check_passcode함수의 인자로 s를 전달하고 반환되는 값이 hashcode값과 같으면 특정 문자열을 출력하고 core함수를 실행시켜주고 그렇지 않을 경우 또 다른 문자열을 출력해준다 (확인해보니 성공과 실패 같은 문자열)

 

 

우선 hashcode값이 어떤 값인지 확인해보았다

hashcode값이 0 C0 D9 B0 A7 h 인 것을 확인할 수 있었다 그럼 이 값과 같게 되어야 할 check_passcode함수를 살펴보았다

4바이트씩 5번을 반복하여 v2 변수에 저장된다 그럼 hashcode값인 0C0D9 BA7h를 5로 나누어 입력하면 된다

하지만 그럴 경우 마지막에 2가 부족하게 나온다 그렇기에 5번째 값에 +2를 해서 보내주면 된다.

 

그 후 실행되는 core함수를 살펴보자

 

이렇게 해서 보낼 경우 pritf함수의 주소 값을 받게 된다 (미처 스샷을 찍지 못하였음)

이로써 pritf함수의 실 주소와 offset를 구해 libc_base주소를 찾아서 rtl을 하면 될 거 같다.

 

offset주소와 /bin/sh 문자열은 pwntools를 통해 얻었다. 최종 공격코드는 아래와 같이 작성하였다.

 

printf함수와 system함수의 offset를 받아와 특정 변수에 저장하고 bin/sh문자열을 특정 변수에 저장 그 후

첫 번째 페이로드에 /5의 값 중 4 갯값과 2가 부족하여 +2한 값 총 5개를 더한 값을 전송 그 후 core함수를 통해 얻게 되는 

printf 주소를 recv를 통해 특정 변수에 저장 printf주소-printf함수의 offset를 통해 libc_base를 획득 후

libc_base +system_offset과 /bin/sh를 통해 함수의 주소를 획득하여 특정 변수에 저장

그 후 최종 페이로드는 core함수를 보게 되면 return read가 있다 이 부분에서 bof가 일어난다 입력받는 곳부터 rsp까지의 거리 값을 구해 66개를 채우고 시스템 함수를 넣고 그 후 4바이트를 더미 값으로 채우고 bin/sh문자열을 넣어 공격코드를 완성했다 해당 프로그램을 실행시키면

성공적으로 플래그 획득에 성공하였다. 

처음에는 되게 막막했던 문제였지만 여러 번 보다 보니 조금씩 이해가 되었던 문제였다.

'my_study > HackCTF' 카테고리의 다른 글

bof_pie  (0) 2021.07.22
basic_fsb  (0) 2021.07.21
rtl_world  (1) 2021.05.28
offset  (0) 2021.05.26
Simple_overflow_bof_ver_2  (0) 2021.05.21