Skip to content
KitploitKITPLOIT
๋„๊ตฌ์ต์Šคํ”Œ๋กœ์ž‡๋ธ”๋กœ๊ทธ
Log in
์ œ์ถœ
๋„๊ตฌ์ต์Šคํ”Œ๋กœ์ž‡๋ธ”๋กœ๊ทธ
์ œ์ถœ

ํ•ดํ‚น, ์นจํˆฌ ํ…Œ์ŠคํŠธ ๋ฐ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ๋„๊ตฌ๋ฅผ ๋‹น์‹ ์˜ ๋ณด์•ˆ ๋ฌด๊ธฐ๊ณ ์—!

Kitploit์€ ํ•ดํ‚น, ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ๋ฐ ์นจํˆฌ ํ…Œ์ŠคํŠธ ๋„๊ตฌ ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ํ”„๋กœ์ ํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์ฐพ๊ณ , ์‹œ์Šคํ…œ์„ ๋ถ„์„ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ , ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜์„ธ์š”.

ยทยทํ”ผ๋“œยท๋ฌธ์˜ยท๊ฐœ์ธ์ •๋ณดยทยฉ 2026 Kitploit

๋„๊ตฌ ๋””๋ ‰ํ† ๋ฆฌ

์นดํ…Œ๊ณ ๋ฆฌ

๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ธฐ
Loading categories
๋„๊ตฌ/GitHubGitHub/mildsunrise/protobuf-inspector
Reverse EngineeringUtilities & FrameworksBinary Analysis
GitHubmildsunrise/protobuf-inspector

protobuf-inspector

๐Ÿ•ต๏ธ ์•Œ ์ˆ˜ ์—†๋Š” ์ •์˜๋ฅผ ๊ฐ€์ง„ Protocol Buffers๋ฅผ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜๋Š” ๋„๊ตฌ

์ €์žฅ์†Œ ๋ณด๊ธฐ
1.1k105495๋…„ ์ „Kitploit ๊ฒ€ํ†  ์™„๋ฃŒ

์ธ๊ธฐ

๋ชจ๋‘ ๋ณด๊ธฐ โ†’

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”.

๋ชจ๋“  ๋„๊ตฌ ํƒ์ƒ‰

๋„๊ตฌ ์ปฌ๋ ‰์…˜์„ ๋‘˜๋Ÿฌ๋ณด์„ธ์š”

๋ชจ๋“  ๋„๊ตฌ ๋ณด๊ธฐ โ†’
๊ณต์œ 

protobuf-inspector

Google Protobuf๋กœ ์ธ์ฝ”๋”ฉ๋œ blob(๋ฒ„์ „ 2 ๋˜๋Š” 3)์„ ํ•ด๋‹น ์ •์˜ ์—†์ด๋„ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. blob์˜ ๋‚ด์šฉ์„ ๋ณด๊ธฐ ์ข‹๊ณ  ์ปฌ๋Ÿฌ๋กœ ํ‘œํ˜„ํ•ด ์ค๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

Main screenshot

๋ณด์‹œ๋‹ค์‹œํ”ผ ํ•„๋“œ ์ด๋ฆ„์€ ๋‹น์—ฐํžˆ ์‚ฌ๋ผ์ง€๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์„ธ ์ •๋ณด๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค:

  • varint๊ฐ€ zig-zag ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€ (๊ธฐ๋ณธ์ ์œผ๋กœ zig-zag ๋ฏธ์‚ฌ์šฉ ๊ฐ€์ •)
  • 32๋น„ํŠธ/64๋น„ํŠธ ๊ฐ’์ด ์ •์ˆ˜์ธ์ง€ ๋ถ€๋™์†Œ์ˆ˜์ ์ธ์ง€ ์—ฌ๋ถ€ (๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘˜ ๋‹ค ํ‘œ์‹œ)
  • ๋ถ€ํ˜ธ ์—ฌ๋ถ€ (๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ๊ฐ์ง€)

ํ•˜์ง€๋งŒ protobuf-inspector๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ์— ์ž„๋ฒ ๋””๋“œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, ๋จผ์ € ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ํŒŒ์‹ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๋ฉด ๋ฌธ์ž์—ด ๋˜๋Š” ํ—ฅ์Šค๋คํ”„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ์ฒญํฌ์—์„œ๋Š” ํŠนํžˆ ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ๊ฐ€ ์™€์ด์–ด์— ์ธ์ฝ”๋”ฉ๋œ ์ˆœ์„œ๋Œ€๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ, ์™€์ด์–ด ํ˜•์‹์— ์ต์ˆ™ํ•ด์ง€๋ ค๋Š” ์‚ฌ๋žŒ์ด๋‚˜ ํŒŒ์„œ ๊ฐœ๋ฐœ์ž, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

pip๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

pip install protobuf-inspector

์ด ๋ช…๋ น์€ protobuf_inspector ๋ช…๋ น์–ด๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ํ•  ๋•Œ protobuf blob์„ stdin์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค:

protobuf_inspector < my-protobuf-blob

blob์˜ ์ฒซ ๋ฒˆ์งธ (๋งน๋ชฉ์ ์ธ) ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ ํ›„, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„๋“œ ์ค‘ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ protobuf-inspector๊ฐ€ blob์„ ๋” ์ž˜ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ ์™„์ „ํ•œ protobuf ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ํŒŒ์„œ๊ฐ€ ๋” ์ด์ƒ ์ถ”์ธกํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ง€์ ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์ •์˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ.

ํŒŒ์‹ฑ ์˜ค๋ฅ˜

ํŒŒ์‹ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ํ•„๋“œ ๋‚ด์—์„œ ํŒŒ์‹ฑ์ด ์ค‘๋‹จ๋˜์ง€๋งŒ, ๊ณ„์ธต ๊ตฌ์กฐ ์™ธ๋ถ€์—์„œ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•„๋“œ ๋‚ด์šฉ์ด ์žˆ์–ด์•ผ ํ•  ์œ„์น˜์— ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ, ํ•ด๋‹น ์ฒญํฌ์—์„œ ํŒŒ์‹ฑ์ด ์ค‘๋‹จ๋œ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ—ฅ์Šค๋คํ”„๋„ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ).

๋”ฐ๋ผ์„œ uint32๋ฅผ ์ง€์ •ํ–ˆ๋Š”๋ฐ ๋” ํฐ varint๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

Error on invalid varint

์–ด๋–ค ํ•„๋“œ์— ์ž„๋ฒ ๋””๋“œ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ง€์ •ํ–ˆ์ง€๋งŒ, ํ•ด๋‹น ์œ„์น˜์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

Error on invalid message

ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์‹ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด main.py๊ฐ€ 0์ด ์•„๋‹Œ ์ƒํƒœ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

ํŒ

blob์„ ๋ถ„์„ํ•  ๋•Œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. varint๊ฐ€ zig-zag ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ถ€ํ˜ธ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋ฉด, varint๋กœ ๋‚จ๊ฒจ๋‘์„ธ์š”. zig-zag ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, 32๋น„ํŠธ์ธ์ง€ 64๋น„ํŠธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ sint64๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  2. ์–ด๋–ค ์ฒญํฌ๊ฐ€ packed chunk ๋˜๋Š” ์ž„๋ฒ ๋””๋“œ ๋ฉ”์‹œ์ง€๋กœ ์ž˜๋ชป ์ธ์‹๋˜๊ฑฐ๋‚˜, ํŒŒ์‹ฑ๋œ ๋ฉ”์‹œ์ง€์— ์ด์ƒํ•œ ์ ์ด ์žˆ์–ด ์›์‹œ ๋ฐ”์ดํŠธ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ํƒ€์ž…์„ bytes๋กœ ์ง€์ •ํ•˜์„ธ์š”. ๋ฐ˜๋Œ€๋กœ ์–ด๋–ค ์ด์œ ๋กœ ์ž„๋ฒ ๋””๋“œ ๋ฉ”์‹œ์ง€๋กœ ๊ฐ์ง€๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ ๊ฐ์ง€๋œ๋‹ค๋ฉด, ๊ฐ•์ œ๋กœ message๋กœ ์„ค์ •ํ•˜์—ฌ ์ด์œ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

  3. ์ฒญํฌ์˜ ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋” ์ž์„ธํžˆ ๋ถ„์„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํƒ€์ž…์„ dump๋กœ ์ง€์ •ํ•˜๋ฉด protobuf-inspector๊ฐ€ ์ผ์น˜ํ•˜๋Š” blob์„ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค dump.0, dump.1 ๋“ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. protobuf-inspector๋Š” blob์„ root ํƒ€์ž…์˜ ๋ฉ”์‹œ์ง€๋กœ ํŒŒ์‹ฑํ•˜์ง€๋งŒ, ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์„ ํƒ์  ์ธ์ˆ˜๋กœ ํƒ€์ž… ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, protobuf-inspector๋Š” root ๋Œ€์‹  ํ•ด๋‹น ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

    protobuf_inspector request < my-protobuf-blob
    

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์ ‘๊ทผ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ:

from protobuf_inspector.types import StandardParser

parser = StandardParser()
with open('my-blob', 'rb') as fh:
   output = parser.parse_message(fh, "message")
print(output)

์ด ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, API๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋Š” protobuf_inspector/__main__.py๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋„๊ตฌ ๋‹ค์šด๋กœ๋“œ