블로그 이전했습니다. https://jeongzero.oopy.io/
[pwnable.xyz] I33t-ness
본문 바로가기
워게임/pwnable.xyz

[pwnable.xyz] I33t-ness

728x90

[pwnable.xyz] l33t-ness

Date
Property
Tagsreport

1. 문제

1) mitigation 확인

보호기법이 다걸려있다. 쉽지 않을것 같다

2) 문제 확인

뭔가 숫자를 입력받는다. 아무 숫자나 넣었는데 바로 끝나버렸다. 빠르게 코드를 확인해보자

3) 코드 확인

조건문을 보면 round_1(), round_2(), round_3() 함수의 반환값들이 모두 참이면 win() 함수가 실행되어 플래그가 출력된다. 각 함수들을 확인해보자

  • round_1()

s 와 v4 변수에 각각 데이터를 입력한다. s는 char 형이지만 atoi 함수를 통해 int형으로 변경된다. strchr 함수를 이용하여 ' - ' 가 입력 문자에 들어있는지 확인하는데, 이는 음수의 입력을 막기위함으로 보인다.

하지만 인티저 오버플로우를 이용하여 음수 값 표현이 가능하다. 21번 라인에서 아까 입력한 값들을 검사하고, True 혹은 False를 리턴한다.

  • round_2()

v4, v5 변수에 signed int 형으로 입력을 받는데, 이 역시 특정 조건 검사 후 True 또는 False를 리턴함

  • round_3()

v2와 v3 그리고 v4에 일정 위치값으로 입력을 총 5개를 받는다. 사실 헥스레이만 보고 생각한 코드흐름이랑 직접 어셈을 확인하면서 디버깅한 흐름이랑 달랐다.

17라인은 결국 v2를 기준으로 4바이트 오프셋에 위치한 값을 검사하는 로직이였고, 20라인도 v2기준 각 4바이트를 더한 값과 곱한값을 비교하는 로직이였다. 따라서 v2 변수에 'y'를 누르고, _DWORD[5] 로 타입캐스팅을 해주었다

더 보기 쉽게 바꼈다.

2. 접근방법

1) round_1() 함수는 결국, 1336 - (-1) 를 입력하면 된다. -1를 직접 입력하면 안되고, 인티져 오버플로우를 일으켜서 알맞게 변형시키면 된다

2) round_2() 함수 역시 인티져 오버플로우를 일으켜서 해당 조건에 맞게 세팅해주면 된다. v4는 1보다 크게, v5는 1337보다 크게 입력하고 두 값을 곱한 것이 오버플로우로 1337이 되게 하면 된다

3) round_3() 함수는 v2 기준으로 각 인덱스의 값이 점점 같거나 커져야 하고, 총4개의 값을 더한 값과 곱한 값이 같으면 된다.

3. 풀이

익스코드를 짤 필요도 없었다

4. 몰랐던 개념

  • 모르는 개념은 없었지만, 리얼월드에서는 직접 변수 타입을 측정해서 구조체를 만들어서 변경해줘야한다고한다. 잘 습득하
728x90

'워게임 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] SUS  (0) 2020.04.11
[pwnable.xyz] strcat  (0) 2020.04.11
[pwnable.xyz] Jump table  (0) 2020.04.11
[pwnable.xyz] J-U-M-P  (0) 2020.04.11
[pwnable.xyz] iape  (0) 2020.04.11