6.1.13 pwn 34C3CTF2017 readme_revenge
้ข็ฎๅค็ฐ
่ฟไธช้ข็ฎๅฎ้ ไธ้ๅธธๆ่ถฃใ
$ file readme_revenge
readme_revenge: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=2f27d1b57237d1ab23f8d0fc3cd418994c5b443d, not stripped
$ checksec -f readme_revenge
RELRO STACK CANARY NX PIE RPATH RUNPATH FORTIFY Fortified Fortifiable FILE
Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH Yes 3 45 readme_revengeไธๆไปฌ็ปๅธธๆฅ่งฆ็้ข็ฎไธๅ๏ผ่ฟๆฏไธไธช้ๆ้พๆฅ็จๅบ๏ผ่ฟ่กๆถไธ้่ฆๅ ่ฝฝ libcใnot stripped ็ปๅฏนๆฏไธชๅฅฝๆถๆฏใ
$ ./readme_revenge
aaaa
Hi, aaaa. Bye.
$ ./readme_revenge
%x.%d.%p
Hi, %x.%d.%p. Bye.
$ python -c 'print("A"*2000)' > crash_input
$ ./readme_revenge < crash_input
Segmentation fault (core dumped)ๆไปฌ่ฏ็็ปๅฎ่พๅ ฅไธไบๅญ็ฌฆ๏ผ็ปๆ่ขซๅๆ ทๆๅฐๅบๆฅ๏ผ่ไธ็่ตทๆฅไนไธๅญๅจๆ ผๅผๅๅญ็ฌฆไธฒๆผๆดใไฝๅฝๆไปฌ่พๅ ฅๅคง้ๅญ็ฌฆๆถ๏ผ่งฆๅไบๆฎต้่ฏฏ๏ผ่ฟๅๆฏไธไธชๅฅฝๆถๆฏใ
ๆฅ็ๅๅ็ฐไบ่ฟไธช๏ผ
็ๆฅ flag ๆฏ่ขซ้่ๅจ็จๅบไธญ็๏ผๅฐๅๅจ 0x006b4040๏ผไฝไบ .data ๆฎตไธใ็ปๅ้ข็ฎ็ๅๅญ readme๏ผๆจๆต่ฟ้ข็็ฎๆ ๅบ่ฏฅๆฏไป็จๅบไธญ่ฏปๅๆ่
ๆณๆผๅบ flagใ
้ข็ฎ่งฃๆ
ๅ ไธบ flag ๅจ็จๅบ็ .data ๆฎตไธ๏ผๆ นๆฎๆไปฌ็็ป้ช๏ผๅบ่ฏฅ่ฝๆณๅฐๅฉ็จ __stack_chk_fail() ๅฐๅ
ถๆๅฐๅบๆฅ๏ผๅ่็ซ ่ 4.12๏ผใ
main ๅฝๆฐๅฆไธ๏ผ
ๅพ็ฎๅ๏ผไปๆ ๅ่พๅ
ฅ่ฏปๅๅญ็ฌฆไธฒๅฐๅ้ name๏ผๅฐๅๅจ 0x6b73e0๏ผไธไฝไบ .bss ๆฎตไธ๏ผๆฏไธไธชๅ
จๅฑๅ้ใๆฅไธๆฅ็จๅบ่ฐ็จ printf ๅฐ name ๆๅฐๅบๆฅใ
ๅจ gdb ้่ฏ่ฏ๏ผ
็จๅบ็ๆผๆดๅพๆๆพไบ๏ผๅฐฑๆฏ็ผๅฒๅบๆบขๅบ่ฆ็ไบ libc ้ๆ็ผ่ฏๅฐ็จๅบ้็ไธไบๆ้ใๅๅพไธ็ไผๅ็ฐไธไบๅฏ่ฝๆ็จ็๏ผ
ๅ็ไธไธๆ ๅๆบฏๆ ๅตๅง๏ผ
ไพๆฌก่ฐ็จไบ printf() => vfprintf() => printf_positional() => __parse_one_specmb()ใ้ฃๅฐฑ็ไธไธ glibc ๆบ็ ๏ผ็ถๅๅ็ฐไบ่ฟไธช๏ผ
่ฟ้ๅฐฑๆถๅๅฐ glibc ็ไธไธช็นๆง๏ผๅฎๅ
่ฎธ็จๆทไธบ printf ็ๆจกๆฟๅญ็ฌฆไธฒ๏ผtemplate strings๏ผๅฎไน่ชๅทฑ็่ฝฌๆขๅฝๆฐ๏ผๆนๆณๆฏไฝฟ็จๅฝๆฐ register_printf_function()๏ผ
่ฏฅๅฝๆฐไธบๆๅฎ็ๅญ็ฌฆ
__specๅฎไนไธไธช่ฝฌๆข่งๅใๅ ๆญคๅฆๆ__specๆฏY๏ผๅฎๅฎไน็่ฝฌๆข่งๅๅฐฑๆฏ%Yใ็จๆท็่ณๅฏไปฅ้ๆฐๅฎไนๅทฒๆ็ๅญ็ฌฆ๏ผไพๅฆ%sใ__funcๆฏไธไธชๅฝๆฐ๏ผๅจๅฏนๆๅฎ็__spec่ฟ่ก่ฝฌๆขๆถ็ฑprintf่ฐ็จใ__arginfoไนๆฏไธไธชๅฝๆฐ๏ผๅจๅฏนๆๅฎ็__spec่ฟ่ก่ฝฌๆขๆถ็ฑparse_printf_format่ฐ็จใ
ๆณไธไธ๏ผๅจ็จๅบ็ main ๅฝๆฐไธญ๏ผไฝฟ็จ %s ่ฐ็จไบ printf๏ผๅฆๆๆไปฌ่ฝ้ๆฐๅฎไนไธไธช่ฝฌๆข่งๅ๏ผๅฐฑ่ฝๅๅฉ็จ __func ๅๆไปฌๆณๅ็ไบๆ
ใ็ถ่ๆไปฌๅนถไธ่ฝ็ดๆฅ่ฐ็จ register_printf_function()ใ้ฃไน๏ผๅฆๆๅฉ็จๆบขๅบไฟฎๆน __printf_function_table ๅข๏ผ่ฟๅฝ็ถๆฏๅฏไปฅ็ใ
register_printf_function() ๅ
ถๅฎไนๅฐฑๆฏ __register_printf_specifier()๏ผๆไปฌๆฅ็็ๅฎๆฏๆไนๅฎ็ฐ็๏ผ
็ถๅๅ็ฐ spec ่ขซ็ดๆฅ็จๅๆฐ็ป __printf_function_table ๅ __printf_arginfo_table ็ไธๆ ใs ไนๅฐฑๆฏ 0x73๏ผ่ฟๅๆไปฌๅจ gdb ้็ๅฐ็็ธ็ฌฆ๏ผrdx=0x73๏ผ[rax+rdx*8]ๆญฃๅฅฝๆฏๆฐ็ปๅๅผ็ๆนๅผ๏ผ่ฝ็ถ่ฟ้็ rax ้ไฟๅญ็ๆฏ __printf_modifier_tableใ
ๆผๆดๅฉ็จ
ๆไบไธ้ข็ๅๆ๏ผไธ้ขๆไปฌๆฅๆ้ expใ
ๅ้กพไธไธ __parse_one_specmb() ๅฝๆฐ้็ if ๅคๆญ่ฏญๅฅ๏ผๆไปฌ็ฅ้ C ่ฏญ่จๅฏน || ็ๅค็ๆบๅถๆฏๅฆๆ็ฌฌไธไธช่กจ่พพๅผไธบ True๏ผๅฐฑไธๅ่ฟ่ก็ฌฌไบไธช่กจ่พพๅผ็ๅคๆญ๏ผๆไปฅไธบไบๆง่กๅฝๆฐ *__printf_arginfo_table[spec->info.spec]๏ผ้่ฆๅ้ข็ๅคๆญๆกไปถ้ฝไธบ Falseใๆไปฌๅฏไปฅๅจ .bss ๆฎตไธไผช้ ไธไธช printf_arginfo_size_function ็ปๆไฝ๏ผๅจ็ปๆไฝๅ็งป 0x73*8 ็ๅฐๆนๆพไธ __stack_chk_fail() ็ๅฐๅ๏ผๅฝ่ฏฅๅฝๆฐๆง่กๆถ๏ผๅฐๆๅฐๅบ argv[0] ๆๅ็ๅญ็ฌฆไธฒ๏ผๆไปฅๆไปฌ่ฟ้่ฆๅฐ argv[0] ่ฆ็ไธบ flag ็ๅฐๅใ
Bingo!!!
exploit
ๅฎๆด็ exp ๅฆไธ๏ผ
ๅ่่ตๆ
Last updated