-
misalignment write upSystem hacking training/pwnable.xyz 2020. 1. 1. 18:49
pwnable.xyz 4번째 문제, 50점 배점이다.
64bit ELF 바이너리이며 모든 보호기법이 적용되어있다.
add문제와 비슷하면서도 다른 문제다.
주된 차이점으로 add문제에서는 입력값이 연산되어 저장되는 배열이 __int64로 선언되어 한 공간에 8byte씩 할당이 되었는데, 이 문제에서는 char형으로 1byte씩 메모리 공간을 할당하여 사용하고 있다.
이 문제에서 flag를 얻기 위해서는 v6[7]에 0xB000000B5이 저장되어야한다.
앞선 문제와 동일하게 사용자 입력을 통해 사용자가 원하는 값을 세팅할 수 있지만 그 값을 넣을 수 있는 위치는 지정할 수 없다.
그 조건은 line 17과 같이 9보다 작거나 같고, -7보다 크거나 같아야한다.
if : -7 <= v9 <= 9
이 때문에 마지막 입력값 v9를 이용하여 접근할 수 있는 메모리는 제한되어있고,
앞선 add문제 풀이 방법처럼 ret에 직접 접근하여 그 위치에 값을 넣을 수 없다.
하지만 배열이 char형으로 선언되어있고, 값을 저장할 때 (_QWORD) 즉, 8byte로 저장하기 때문에 접근이 가능하다.
v6[8 * (v9 + 6)] = v7 + v8 에서 v9에 대한 입력 조건을 만족하면서 v6배열을 건드릴 수 있는 v9는 -6과 -5다.
v6[8 * (v9 + 6)] = v7 + v8
v9에 -6을 입력하면 v6[0]에 값을 저장할 수 있고, -5를 입력하면 v[8]에 값을 쓸 수 있다.
v6은 다음과 같이 1byte씩 15개의 공간이 할당된다.
이제 v9에 -6이 들어가면 QWORD(8byte)만큼 저장하기 때문에
다음과 같이 v6[0 ~ 7] 공간에 원하는 값을 저장할 수 있다.
그리고 -5를 입력했을 때 다음과 같이 v6[7 ~ 14] 공간에 접근 및 값을 쓸 수 있다.
따라서 두번에 걸쳐서 if문 조건에 만족하는 0xB000000B5값을 넣고, 반복문을 빠져나오면 flag를 획득할 수 있다.
(물론 10진수로 입력 받기 때문에 10진수로 입력해야한다.)
from pwn import * p = remote('svc.pwnable.xyz', 30003) p.sendline('0 -5404319552844595200 -6') p.sendline('0 184549376 -5') p.sendline('d') p.interactive()
⚡ root@ubuntu /mnt/hgfs/vm_shared/pwnable.xyz python a.py [+] Opening connection to svc.pwnable.xyz on port 30003: Done [*] Switching to interactive mode Result: -5404319552844595200 Result: 184549376 FLAG{-----------------------------}[*] Got EOF while reading in interactive $ [*] Interrupted [*] Closed connection to svc.pwnable.xyz port 30003
반응형'System hacking training > pwnable.xyz' 카테고리의 다른 글
note write up (1) 2020.01.10 GrownUp write up (0) 2020.01.02 add write up (0) 2020.01.01 sub write up (0) 2019.12.31 Welcome write up (0) 2019.12.22