워게임/pwnable.xyz

pwnable.xyz - welcome

1번 문제.

오늘부터 pwnable.xyz도 풀어 볼 것이다.

학교 보안동아리에서 시스템 해킹 분야 멘토링 ?? 에 참가하게 되었다.


📖 1) 문제 파악

 

먼저 문제를 확인해보자. nc인가 ??

대충 이렇게 진행이 된다. Leak 부분에는 메모리 주소를 알려주는 것 같다.

 

이런 상태이다.

system 함수가 존재하는 것을 알 수 있다.

 


📖 2) 문제 분석

_libc_start_main() 함수가 보인다. main 함수로 들어가보자.

 

 

우선 이 문제를 풀기 위하여 !*v3 값이 참이어야 한다. 즉 *v3은 false가 나와야 하고 *v3 === 0 이어야 한다.

 

QWORD *v3 코드에 의해 8바이트 크기를 가진 unsigned __int642 가 되었다.

그리고 malloc을 통해서 0x40000 의 크기만큼을 동적할당해주었다. (262144 바이트만큼)

 

v3 배열(?) 의 첫 번째 요소에 1을 집어넣는다. 이후 Leak과 함께 v3의 주소를 출력해준다.

집어넣어진 저 1을 0으로 바꿔야 하는 것이 목적이다. 애초에 leak 자체가 누수라는 뜻이다.


그럼 이제 몇 바이트를 덮어야 하는 지를 계산해야 한다.

한 가지 중요한 것은 스택이 아니라 힙에서 오버플로우를 발생시켜야 한다는 것이다.

 

우선 코드를 좀만 더 천천히 읽어보도록 하자.

아직 잘은 모르겠지만 이렇게 생기지 않았을까 싶다. 물론 각각 dummy는 존재할 수도 있다.

Leak이라면서 알려주는 주소는 v3이겠다.

마지막 부분을 보면

  v4[size[0] - 1] = 0;
  write(1, v4, v5);

이런 코드가 존재한다. 여기서 오버플로우가 발생될 수 있을 것 같다.

 

값 변화를 좀 더 자세히 보기위해 pwndbg를 사용하자.


문제가 있다. 위의 사진처럼 disassemble main을 하였는데 로드가 되지 않았다.

그래서 main 주소를 직접 찾아주어야 한다.

 

왼쪽 상단의 저 주소 0x555555554000 가 바로 기본 베이스 주소이다.

그리고 ida에서 확인할 수 있는 0000000000000920 이것이 오프셋 주소이다.

 

그럼 0x555555554000 + 0x920 이 main함수 주소가 되는 것이다.

즉, main 주소는 0x555555554920 이것이 된다.