이번 문제는 저번 14에 이어 루틴 분기 문제이다
이번에는 포인터를 써서 조금 꼬아놓은 문제이다
우선 스택 구조부터 알아보자.
소스에서는 총 28바이트가 사용되고
스택 프레임에서 0x38, 56바이트를 할당했다 더미가 있다
더미를 추측해보자
우선 ebp-56 부분에 buf가 시작된다
그리고 ebp-16값을 0xdeadbeef와 비교한다 이 부분은 check인 것 같다
그렇다면 우선 56바이트에서 16바이트를 빼면 40바이트, 그리고 20바이트가 먼저 buf로 사용된다
그럼 나머지 20바이트는 더미 그리고 check가 나오고 그 이후의 정보는 알 수 없다
그래서 이렇게 생기지 않았을까 추측했다
그리고 힌트의 소스를 조금 변경해 다시 컴파일 한후 디스어셈블링해봤다
Ebp-12 부분에 1이 들어가는 걸 볼 수 있다
그러면 스택은 이런 구조가 된다
자 이제 스택 구조도 알았고 문제를 풀면 되는데 우선 check의 부분에 뭐가 들어가 있는지 알아보자
아무 값도 들어 있지 않다
우리는 이 포인터에 0xdeadbeef라는 값을 가지고 있는 주소를 가리킬것이다
버퍼에 0xdeadbeef를 넣어놓고 주소를 넣어줘도 되고
환경변수에 0xdeadbeef를 넣어놓고 주소를 가리켜도 된다
그러나 우리 환경에는 ASLR이라는 메모리 보호기법이 걸려 있기 때문에 버퍼에 넣어서 하기는 매우 힘들다
그러므로 우리는 환경변수에 0xdeadbeef를 넣어놓고 환경변수의 주소를 알아낸 다음에 그 주소를 check에 넣을 것이다
우선 환경변수를 만들자
변수를 출력했을 때 저렇게 나오는 것은 우리가 deadbeef를 16진수를 넣어줬기 때문이다
자 이제 저 환경변수가 시스템 내에 어디에 있는지 알아내는 툴을 이용하자
사용법은 다음과 같다
프로그램 이름 환경변수이름 사용할프로그램이름
그럼 다음과 같이 주소가 나온다
자 이제 check에 저 주소만 넣기만 하면 된다
이렇게 level15를 클리어했다
Phantom@TeamH4C