15. horcruxes
ROP 문제다
접속을 해보자
9032 포트
를 통해 바이너리를 실행시킬 수 있다.
IDA로 분석을 위해 먼저 바이너리를 다운받아본다.
main
함수이다.
랜덤한 값에서 a
, b
, c
, d
, e
, f
, g
의 값이 만들어지고 그 모든 값을 더한 값이 sum
이 된다
ropme
함수이다.
사용자가 입력한 값이 a
, b
, c
, d
, e
, f
, g
중 하나에 해당할 경우
그에 맞는 A
, B
, C
, D
, E
, F
, G
함수가 실행된다.
대문자 이름을 가진 각 함수는 위와 같이 생겼다.
호출되면 조건 분기문에서 검사하는 값을 출력한다.
결과적으로 사용자가 입력한 값이 sum
과 일치해야 한다
따라서 사용자는 a
, b
, c
, d
, e
, f
, g
의 값을 알아야 하고
gets
함수에서 buffer overflow가 가능하니 ROP 기법을 이용해 A
, B
, C
, D
, E
, F
, G
함수를 호출하여 알아낼 수 있다.
ropme
를 보면 먼저 0x78
만큼의 스택 크기를 사용하는데
이부분이 gets
함수에 사용되는 buf 메모리 크기이다.
따라서 0x78
이후의 4바이트
는 ropme
의 return 주소일 것이다.
실제 buf의 시작 주소로부터 0x78
이후에 return 주소가 있다.
각 함수의 주소는 이렇고