Python 3 + pwntools 자주 하는 실수

2022. 7. 9. 10:03·Tips & theory
728x90
반응형

변수의 타입을 확실하게 구분하며 출력함에 따라 자꾸 헷갈린다 ㅠㅠ

자주 하는 실수를 정리했다.


ssh 서버에 접속해서 특정 파일을 실행할 때

s = ssh(user='app-systeme-ch83',host='challenge03.root-me.org',port=2223,password='app-systeme-ch83')
p=s.process('./ch83')

이와 같이 선언하였을 때 서버에서 값을 받아오는지, 프로그램에서 받아오는지 확실히 해야 한다.

p.recv(12) #프로그램에서 문자를 받아올때
s.recv(12) #서버에서 문자를 받아올때

변수를 선언할 때는 확실하게 선언할 것.

보통은 byte로 값을 처리하기 때문에

payload = b''
payload += b '\x90'*100

와 같이 선언 후 값을 넣어주자.


출력 시에도 마찬가지로 byte로 값을 받아오기에 스트링으로 출력해주자.

print (p.recv(1024).decode())

decode 다음에 괄호 빠뜨리지 말자!

 


주소를 받아왔을 때는 문자열로 받아오기에 packing 하려면 0x를 제외하고 int 값으로 변경한 다음 packing 하자

offset=0x10

address1 = p.recv(4)
address2 = p32(int(address1,16) + int(offset))

address3 = p.recv(12) #64bit의 경우 앞의 4byte는 사용하지 않기에 12 byte를 입력받는다.
address4 = p64(int(adddress3,16) + int(offset))

하지만 직접 주소를 넣어줄 때는 그냥 써주면 된다.

즉, 문자열로 값을 받아왔을 때 문제가 되는 것.

address = p32(0xdeadbeef)

 

추가)

주소 값을 받는 방법은 여러가지가 있는데, 아래와 같이 세련되게 할 수 있다.

int(p.recvline()[a:b],16)

의미는

우선 출력되는 한 줄 전체를 다 받은 다음 a 부터 b 까지 끊는다.

예를 들어 123456789의 값을 받아들일 때

p.recvline()[1:3]

p.recvline()[1:3]

으로 받으면, 0부터 값이 들어가기에 끊은 값은 23 이 된다.

이후 해당 값을 16진수로 처리하면 된다.


파일을 실행하며 인자를 넘겨줄때는 list 형식으로 전달되어야 한다.

totlen = 512

pay = ['' for i in range(2)]
pay[0] = './ch7'
pay[1] = b''
pay[1] += b'\x90'*50
pay[1] += shellcode
pay[1] += b'\x90'*(totlen-len(pay[1]))
pay[1] += p32(0x0804a040)

p = process(pay)

와 같이 실행 가능하다.

또는

totlen = 512

filename = './file'

pay = b''
pay += b'\x90'*50
pay += shellcode
pay += b'\x90'*(totlen-len(pay[1]))
pay += p32(0x0804a040)

execute = ['filename',pay]

p = process(pay)

와 같이 실행 가능하다.


22.9.15

빡쳐서 한 줄 더 쓴다.

만일 바이너리에서 scanf로 값을 받아들일 때

sendline으로의 값 전달은 필수이다. (엔터가 무조건 들어가야한다는 말.)

더불어 sendline의 경우 str 값만 정상적으로 전달하기에 int 값은 반드시 str(val)와 같이 써줘야 한다.

즉, 아래와 같다.

a = b'abcdef'
p.sendlineafter(b'data: ',a)
b = 1234
p.sendlineafter(b'data: ',str(b))

 

read로 값을 받아들일때에는 sendline을 쓰면 마지막에 \x0a가 들어가기에 유의할 것.

728x90
반응형

'Tips & theory' 카테고리의 다른 글

libc에서 offset 찾기.  (0) 2022.07.29
문제에서 제공된 libc 파일 사용.  (0) 2022.07.28
GDB run 실행 후 입력 값 넘기기  (0) 2022.07.15
/bin/sh 문자열 주소 찾는 방법.  (0) 2022.07.14
Kali linux setup  (0) 2022.07.02
'Tips & theory' 카테고리의 다른 글
  • 문제에서 제공된 libc 파일 사용.
  • GDB run 실행 후 입력 값 넘기기
  • /bin/sh 문자열 주소 찾는 방법.
  • Kali linux setup
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (502) N
      • To do list (7)
        • Doing (1)
        • Complete (6)
      • Diary (35)
      • Tips & theory (79) N
      • Kernel Exploit (27)
        • Theory (15)
        • Exercise (5)
      • Wargame (313)
        • pwn.college (34)
        • Dreamhack (148)
        • pwnable.kr (15)
        • Lord of Sqlinjection (3)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (41)
        • Solved (39)
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    exploit education
    hackerschool
    cryptohack
    root-me
    libc
    dreamhack
    la ctf
    RTL
    pwntools
    ROOT ME
    FSB
    heap
    rop
    x64
    docker
    CANARY
    _IO_FILE
    Me
    root
    x86
    Format String Bug
    pwnable.kr
    BOF
    32bit
    vtable
    64bit
    lob
    phoenix
    tcache
    Buffer Overflow
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
Python 3 + pwntools 자주 하는 실수
상단으로

티스토리툴바