pwnable.xyz - welcome

728x90

Decompile

 

malloc함수를 통해 할당받은 청크의 주소 출력

청크의 주소는 $rbx에 들어감

사이즈를 입력 받고, 그 사이즈를 인자로 한 malloc 반환 값은 레지스터들에 저장

$rax, $rcx, $rdx에 저장

message를 입력하면 청크에 저장이 된다.

Decompile 사진을 보면 flag 출력 조건이 *pVar1이 0이면 플래그를 출력해준다.

첫 malloc(0x40000) 후 pVar1 값을 1로 초기화 해주는데, 이 값은 $rbx에 저장이 되어 있다.

이 $rbx값을 0으로 바꿔준다면 flag를 얻을 수 있을 것이다.

 

다음 사진은 write 함수 호출 전까지의 레지스터 상태이다.

mov BYTE PTR [rbp+rdx*1-0x1], 0x0 -> rbp+rdx*1-0x1이 가리키는 주소에 0을 저장한다

 

그럼 값이 저장되는 과정을 살펴보자

$rbp, $rsi에는 청크의 주소가 담겨있다.

1) rsp가 가리키는 주소의 값을 rdx에 저장, 이때 rsp에 저장된 값은 맨 처음 size로 입력한 값

2) rbp값을 rsi에 저장

3) edi에 0x1 값 저장

4) 0을 rbp+rdx*1-0x1이 가리키는 주소에 저장

 

그럼 이러한 주소에 0이 저장되는데, 이 주소는 top chunk의 주소이다

 

그런데 만약 저 top chunk 사이즈를 넘는 청크를 할당하면 어떻게 될까?

답은 mmap으로 청크를 할당하며 다른 곳에 할당하게 된다.

 

그럼 시험해보자.

leak한 chunk의 주소 값에서 1을 더한 값을 size로 주었을때 변화를 보자

rsp가 가리키는 주소의 값이 0임을 확인할 수 있다
또한 heap이 아닌 다른 주소에 할당됨을 볼 수 있다.

그리고 size에 아무런 값을 주지 않고 넘기면 플래그를 볼 수 있다.

 

728x90

'pwnable.xyz' 카테고리의 다른 글

pwnable.xyz - Grownup  (0) 2021.07.23
pwnable.xyz - misalignment  (0) 2021.07.22
pwnable.xyz - add  (0) 2021.07.20