duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
无话可说
终于会用这玩意了... 真好用啊
This media is not supported in your browser
VIEW IN TELEGRAM
第一次知道 radare2 这个著名泥像框架还可以用来调试程序...
总是 segfault...
... 现在还不能算三年血赚猝死不亏
hello.S

.section .rodata

hello_world: .string "你好,世界!\n"

.section .text

.globl _start

_start:
call main # call assembly main

mov $60, %rax # sys_exit
mov $0, %rdi # exit status

syscall # make call

sysprintf:
mov %rsp, %rbp # stdcall

mov $1, %rax # sys_write
mov $1, %rdi # use stdout

pop %rsi # string ptr
pop %rdx # length

syscall

ret

main:
mov %rsp, %rbp

mov $hello_world, %rax
dec %rax

push %rax
push $20
call sysprintf

ret

Makefile

hello: hello.S
as hello.S -o hello.o
ld -o hello hello.o -lc -I /usr/lib64/ld-2*.so

clean:
rm -f hello hello.o


.PHONY: clean


执行时

[DuangSUSE@duangsuse asm-foo]$ ldd hello
linux-vdso.so.1 (0x00007fffe01b7000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9e9e68c000)
/usr/lib64/ld-2.27.so => /lib64/ld-linux-x86-64.so.2 (0x00007f9e9ea4b000)

hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /usr/lib64/ld-2.27.so, not stripped

9: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.o
10: 000000000040021c 0 NOTYPE LOCAL DEFAULT 6 hello_world
11: 0000000000400206 0 NOTYPE LOCAL DEFAULT 5 main
12: 00000000004001f0 0 NOTYPE LOCAL DEFAULT 5 sysprintf

[DuangSUSE@duangsuse asm-foo]$ ./hello
�你好,世界!


... 虽然还有一点小问题,比如不知道为何字符串指针减少一位后才能不 SegFault 否则 会在 main 的 ret 治疗执行时无法正常跳转
和每次执行时 Zsh 都会吐出一个不知名符号出来外,通宵血赚,鸽子不亏 😶
This media is not supported in your browser
VIEW IN TELEGRAM
另外我有点「x86 和 8085 那类机器以及 arm 系列更简单」的感觉

毕竟 ARM 是 RISC 嘛,但 ARM 还不至于到除法都要手动汇编子过程解决
duangsuse::Echo
hello.S .section .rodata hello_world: .string "你好,世界!\n" .section .text .globl _start _start: call main # call assembly main mov $60, %rax # sys_exit mov $0, %rdi # exit status syscall # make call sysprintf: mov %rsp, %rbp # stdcall…
刚才已经通过 hexdump 查明了,这个不知道是啥的字符其实是 \xC3

刚才拿 Ruby 查看了一下,
"\x48c3 \x6c\x65 \x6f\x6c \x57\x20 \x72\x6f \x64\x6c \x00\x0a"

"Hc3 le ol W ro dl \u0000\n"

"\xC3HelloWorld\u0000\n"

确定数据上可能有些没有预期的东西发生呢
duangsuse 之前对字序不了解,不清楚都是以半字为单位倒过来的
将会及时通过 EDB 查明出错原因
duangsuse::Echo
将会及时通过 EDB 查明出错原因
已经查明

00000000:0040021b|c3 e4 bd a0 e5 a5 bd ef bc 8c e4 b8 96 e7 95 8c|................|
00000000:0040022b|ef bc 81 0a |.... |


大概是 dec %rax 的时候指针向后移动了字节,导致非字符串本身的字符出现在字符串内部 😶
刚才看到 ret 指令的机器代码是 0xc3 所以就明白了大概的错误原因,正在尝试反汇编再次分析和修复
问题彻底得以确认,再次折寿三年血赚猝死不亏...
This media is not supported in your browser
VIEW IN TELEGRAM
其实这样感觉非常的邪恶,而且明显不应该这样

c3 是我修改字符串指针后被增加的,减小指针使最后一个 ret 指令变成了字符串序列的一部分呢,这是很不好的做法

之前据测试,如果不这样便会导致 CPU 执行到 ret 指令时不会正常返回,而本应该返回到 _start 的,却继续往下解码执行不是机器代码的字符串数据,这实在是太邪恶了
目前仍然不知道为何执行 ret 时没有正常重置 PC,以及为何将 write(fd, data, len) 调用的 buffer 指针参数往前调一位就可以正常执行,但是感觉这不太妙,如果有大佬的话也欢迎来尝试一下
This media is not supported in your browser
VIEW IN TELEGRAM
re2c 是 C 程序员有时可能用到的分词工具,估计是由于某些词法定义类似正则表达式起名叫 re2c