EVI$ION Write up - 4

Tamszero·2024년 11월 13일

이비전

목록 보기
9/12

1. 드림핵 rev-basic-0

correct를 출력하는 입력값을 찾는 문제

IDA를 통해 chall0파일을 열어 분석

메인함수를 디컴파일 해 보면
sub함수를 호출해 correct/wrong을 출력하는 것을 알 수 있다

sub함수 내부로 진입해보면
해당 스트링과 비교하는 것을 알 수 있다

2. 드림핵 patch

flag를 가리고있는 부분을 분석해
flag를 보이게 해야하는 문제

winmain함수로 들어가 디컴파일을 하면
사이즈와 스타일을 정의하고 sub함수를 호출하고있는 부분이 있다
이 함수로 들어가보면

beginpoint와 endpoint사이에 또 sub함수를 호출하고있다.
이 함수 내부로 또 진입

함수 내부에서는 또 서브함수 140002B80을 연속적으로 호출하고있으므로
브레이크 포인트를 걸고 실행해보면

그림과 같이 플래그를 검은색 선으로 그리면서 가리는 함수인 것을 알 수 있다

해당 서브함수 주소로 들어가

패치 어셈블을 통해 코드를 retn으로 수정하여 아무런 일도 일어나지 않게 한 후
패치 apply를 하면


가려진 부분을 제거한 flag값을 볼 수 있다.

3. 드림핵 rev-basic-8

사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이다. correct를 출력하는 입력값을 찾는 것이 문제

먼저 메인함수를 디컴파일해준다.
조건문에서 sub함수를 호출하므로 해당 서브함수로 진입

이 함수는 반복문으로 이루어져있다.

for : 0x15 (21만큼) 반복, 
if: *(_BYTE *)(a1 + i)는 주소 a1에서 i 오프셋에 위치한 바이트 값을 가져온다
이 바이트 값을 -5와 곱하고 unsigned __int8로 캐스팅하여 byte_140003000[i] 배열의 i 번째 요소와 비교
두 값이 같지 않다면 함수는 0LL (64비트 정수형 0)을 반환하며 즉시 종료

** (unsigned __int8)는 바이트 단위(0~255)로 값을 제한

즉 이 함수는 주소 a1에 있는 첫 21바이트가 특정 값과 일치하는지 검증한다
바이트별로 -5를 곱한 결과가 byte_140003000 배열의 값과 일치하는지 확인하며, 불일치 시 0, 일치 시 1을 반환하는 함수이다.

브루트포싱을 활용한 exploit 코드
j 251 & 255 == arr[i] 는 -5의 역연산이다

0개의 댓글