FTZ WriteUp

Level15

 

이번 문제는 저번 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

댓글

댓글 본문