문제 파일을 file 명령어로 확인해보면 리눅스 64비트 실행파일임을 확인할 수 있다.

gdb로 파일을 열어보면 함수 목록도 확인할 수 없었고, main 함수도 확인할 수 없었다.

문제 설명을 보니 pack 라는 단어가 있었고, 리버싱 문제라고 한다. 그래서 exeinfo라는 툴을 통해 패킹 된 파일인지 확인해 보았다.

upx라는 패커로 패킹된 것을 확인할 수 있었고, exeinfo에서 제공해주는 github 사이트에서 언팩 툴을 구할 수 있었다.

upx.exe -d 옵션으로 언패킹 할 수 있었다.

언팩 된 flag 파일을 아이다로 열어보면 main 함수를 확인할 수 있었고 main 함수에서 flag를 들어가 보면 플래그로 보이는 문자열을 찾을 수 있었다.

 

머신러닝을 구현할 때는 미 가공 데이터를 머신러닝 알고리즘이 처리할 수 있는 형태로 가공시켜야 한다. 이것을 전처리 라고 한다. 데이터 전처리는 파이썬의 numpy 모듈과 sklearn 모듈을 사용한다.

 

샘플 데이터 생성

 

이진화

이진화는 숫자를 이진수로 변환하는 기법이다. 사이킷런 모듈에서 제공하는 메소드로 입력 데이터를 이진화 할 수 있다.

기준 값으로 설정한 2.1보다 큰 값은 1로, 나머지는 0으로 변환된 것을 확인할 수 있다.

 

평균제거

특징 벡터의 값들이 0을 중심으로 분포하게 만들 때 평균 제거 기법을 만들 수 있다.

우선 현재 데이트들의 평균과 표준편차는 다음과 같다.

평균 제거는 preprocessing.scale() 함수로 할 수 있다.

평균값은 0에, 표준편차는 1에 가깝게 조정되었다.

 

크기조정

특징 베터의 각 요소에 대한 값의 범위는 일정하지 않을 수 있다. 머신 러닝 알고리즘을 학습시키려면 모든 특징을 동일 선상에서 비교할 수 있도록 각각의 특징에 대한 값의 범위를 일정한 기준으로 조정해야 한다. 

각 행마다 최댓값은 1로, 나머지는 1을 기준으로 상대적인 값으로 표현하였다.

 

정규화 

특징 벡터의 값을 일정한 기준으로 측정하기 위한 것이다. 대표적인 정규화 기법으로는 총 합이 1이 되도록 값을 조정하는 L1 정규화와 각 행의 절댓값의 합이 1이 되도록 조정하는 L2 정규화가 있다. L1 정규화 기법은 데이터의 이상치(아웃라이어)에 영향을 덜 받기 때문에 더 안정적이며 이상치가 문제 해결에 중요한 역할을 한다면 L2 정규화를 사용하는 것이 낫다.

 

문제를 보면 문제 파일과 소스파일을 준다. 문제 파일을 file 명령어로 확인하면 32비트 실행파일임을 확인할 수 있다.

문제 파일의 c 소스 파일은 다음과 같다.

main 함수에서는 func함수를 실행하고 있고, func 함수에서는 key를 인자로 받고 있고, key 값이 0xcafebabe면 system 함수로 쉘을 실행하고 있다. overflow 변수에 값을 입력받는데, overflow의 크기는 32바이트인데, 입력받는 곳에서 크기의 제한을 하고 있지 않아서 bof 취약점이 발생할 것 같다. gdb로 main 함수와 func 함수를 보면 다음과 같다.

func + 40의 위치에서 func함수의 인자와 0xcafebabe를 비교하고 있다.

func + 40에 breakpoint를 걸고 실행하여 값(AAAAA

~

)를 넣어주고 esp를 확인해보면 다음과 같다.

넣어준 값과 main함수에서 func를 실행할 때 인자로 넣은 0xdeadbeef의 위치를 확인할 수 있다. 0xdeadbeef가 있는 위치까지 입력값으로 덮고 0xcafebabe를 덮으면 조건을 만족시켜 system함수를 실행시킬 수 있을 것 같다.

입력값이 들어가는 부분의 시작 위치는 0xffffd09c 이고, 0xdeadbeef의 시작점은 0xffffd0d0이므로 0xffffd0d0 - 0xffffd09c는 10진수로 52이다. 따라서 52만큼 다른 값을 채우고, 0xcafebabe를 리틀엔디언 형식으로 넣으면 쉘을 딸 수 있을 것 같다.

다음과 같이 파이썬 코드를 짜서 실행시켰다.

1
2
3
4
5
6
from pwn import *
 
= remote("pwnable.kr"9000)
pay = "A" * 52 + p32(0xcafebabe)
p.sendline(pay)
p.interactive()
cs

+ Recent posts