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…
刚才已经通过
"\xC3HelloWorld\u0000\n"
确定数据上可能有些没有预期的东西发生呢
duangsuse 之前对字序不了解,不清楚都是以半字为单位倒过来的
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 之前对字序不了解,不清楚都是以半字为单位倒过来的
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 的时候指针向后移动了字节,导致非字符串本身的字符出现在字符串内部 😶其实这样感觉非常的邪恶,而且明显不应该这样
之前据测试,如果不这样便会导致 CPU 执行到
目前仍然不知道为何执行
c3 是我修改字符串指针后被增加的,减小指针使最后一个 ret 指令变成了字符串序列的一部分呢,这是很不好的做法之前据测试,如果不这样便会导致 CPU 执行到
ret 指令时不会正常返回,而本应该返回到 _start 的,却继续往下解码执行不是机器代码的字符串数据,这实在是太邪恶了目前仍然不知道为何执行
ret 时没有正常重置 PC,以及为何将 write(fd, data, len) 调用的 buffer 指针参数往前调一位就可以正常执行,但是感觉这不太妙,如果有大佬的话也欢迎来尝试一下Forwarded from 天天向上 (Basic I/O Interface)
The latest version of re2c (1.1) was released.
类似的 lex / yacc like 工具链有 Lex /Flex 和 Yacc / Bison
此外还有 Parser combinator,但是我完全不了解,两个概念不能混为一谈
此外还有 Parser combinator,但是我完全不了解,两个概念不能混为一谈
duangsuse::Echo
qqq.c
另外有一块堆内存我没 free... 要用的时候记得自己 free
free(tqvm->tape_ptr);typedef struct qqqvm_st {
int *tape_ptr;
size_t tape_size;
size_t cell_ptr;
} TQVM;
int main(int argc, char *argv[]) {
TQVM tqvm;
TQVM_InitiateVM(&tqvm);
if (argc > 1)
TQVM_GrowHeap(&tqvm, atoi(argv[1]));
TQVM_Interpret(&tqvm, getchar);
TQVM_DebugBuffer(&tqvm);
printf("\nFinised QQQVM at 0x%x with final heap size %i and cell pointer to %i\n",
&tqvm, tqvm.tape_size, tqvm.cell_ptr);
return tqvm.cell_ptr;
}