Name:
Anonymous
2014-04-26 23:52
$ cat bork.asm
section .data
fuck: dd 0xDEADBEEF
section .text
global _start
_start:
mov dword [fuck],0xABADC0DA
mov eax,1
mov ebx,0
int 0x80
Why doesn't writing to the .data segment segfault? Shouldn't Linux map it to a read-only page?
$ nasm -f elf bork.asm
$ gold -s -o bork-gold bork.asm
$ ld -s -melf_i386 -o bork-ld bork.o
$ du -bh *
432 bork-gold
132 bork.asm
340 bork-ld
608 bork.o
How does such a minimal binary take up 300+ bytes?
Name:
Anonymous
2014-04-29 15:57
I did it! Prime number generator in assembly! WOW
#include <stdio.h>
int asm_main(void);
void print_number(int i) { printf("%d\n",i); fflush(stdout); }
int main(void) { return asm_main(); }
extern print_number
extern puts
section .data
msg db "LETS PRIMES.. 2",0
section .bss
prm: resd 1
num: resd 1
mem: resd 130000
section .text
global asm_main
asm_main:
enter 0,0
pusha
push ebp
mov ebp,esp
push msg
call puts
add esp,4
pop ebp
mov dword [num],0
mov dword [prm],3
.loop:
;; Here we put the prime we found
;; into the list of primes
mov eax,[prm]
inc dword [num]
mov ebx,[num]
mov [mem+4*ebx],eax
mov ebp,esp
push eax
call print_number
add esp,4
call next_prime
jmp .loop
popa
mov eax,0 ; return 0
leave
ret
next_prime:
add dword [prm],2
mov ebx,0
.loop:
inc ebx
mov eax,[prm]
mov ecx,[mem+4*ebx]
mov edx,0
div ecx ; eax/(ecx:edx)
cmp edx,0
je next_prime
cmp ebx,[num]
jne .loop
ret