การเอาท์พุทบางส่วนจาก xxd และเปลี่ยนมันให้เป็น shellcode ที่ใช้งานได้ด้วยมือนั้นไม่สนุกดังนั้นงานของคุณคือทำให้กระบวนการเป็นไปโดยอัตโนมัติ
กฎระเบียบ
การส่งของคุณอาจเป็นฟังก์ชั่นแลมบ์ดาสคริปต์หรือสิ่งอื่นใดที่เทียบเท่าตามสมควร คุณสามารถพิมพ์ผลหรือถ้าการส่งของคุณเป็นฟังก์ชั่น / แลมบ์ดาคุณอาจส่งคืนได้
คุณโปรแกรมต้องใช้เวลาสามอาร์กิวเมนต์แรกเป็นสตริงที่มีการส่งออกของ xxd วิ่งที่มีการขัดแย้งไม่มีอื่น ๆ xxd some_file
กว่าชื่อไฟล์เช่นนี้ นี่คือตัวอย่างของสิ่งที่อาร์กิวเมนต์แรกจะมีลักษณะ:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
คุณจำเป็นต้องใช้ส่วนตรงกลางที่มีไบต์ (8 คอลัมน์แรกหลัง:
) และเปลี่ยนเป็น shellcode โดยการลบช่องว่างใด ๆ จากนั้นใส่\x
ก่อนแต่ละไบต์
นี่คือสิ่งที่ควรเป็นผลลัพธ์สำหรับอินพุตด้านบน (ละเว้นอาร์กิวเมนต์อื่น ๆ ):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
คุณสามารถสันนิษฐานได้ว่าอาร์กิวเมนต์แรกจะเป็นผลลัพธ์ xxd ที่ถูกต้องเสมอโดยไม่มีข้อโต้แย้งอื่นใดนอกจากชื่อไฟล์
เอาต์พุตของคุณควรเป็นสตริงที่แบ็กสแลชเป็นแบ็คสแลชที่แท้จริงไม่ใช้เป็นอักขระเลี่ยง ดังนั้นเมื่อฉันพูดว่า "\ x65" ฉันไม่ได้พูดถึงไบต์ 0x65 หรือแม้แต่ตัวอักษร "A" ในรหัสมันจะเป็นสตริง "\ x65"
อาร์กิวเมนต์ที่สองระบุตำแหน่งที่ในเอาต์พุต xxd ที่ shellcode ควรเริ่มทำงานและอาร์กิวเมนต์ที่สามระบุตำแหน่งที่ควรจะจบ หากอาร์กิวเมนต์ที่สามคือ-1
มันจะสิ้นสุดในตอนท้ายของเอาต์พุต xxd อาร์กิวเมนต์ที่สองและสามจะไม่เป็นลบเสมอยกเว้นเมื่อมีการโต้แย้ง-1
นี่คือกรณีทดสอบบางส่วน:
อาร์กิวเมนต์ 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
อาร์กิวเมนต์ 2 7
:, อาร์กิวเมนต์ 3: e
(ทั้งคู่เป็นสตริงที่แสดงถึงเลขฐานสิบหก)
เอาท์พุท: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
อาร์กิวเมนต์ 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
อาร์กิวเมนต์ 2 0
:, อาร์กิวเมนต์ 3:2e
เอาท์พุท: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
อาร์กิวเมนต์ 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
อาร์กิวเมนต์ 2 a
:, อาร์กิวเมนต์ 3:-1
เอาท์พุท: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
รหัสที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ ผู้ชนะจะได้รับการประกาศในเจ็ดวันในวันที่ 15 สิงหาคม 2016 (แต่การส่งหลังจากนั้นยังคงชื่นชม)
ปรับปรุง
ยินดีด้วยกับ@Adnanเพื่อชนะการท้าทาย!
~
\x7e
และเราสามารถกลับมา\t
แทนได้\x09
หรือไม่
7
ดูเหมือนกับดัชนี zero-based และe
เป็นดัชนีแบบใช้ครั้งเดียว ( e-7=7
แต่มีรหัสฐานสิบหก 8 ในผลลัพธ์ของคุณ), หรือฉันมองอะไร