Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C/ASM] syscall 149, 6 arguments struct

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Voor een oefening probeer ik een parameter in /proc/sys/kernel te overschrijven.
Het volgende programma build zonder errors: (gcc -Wall):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "/usr/include/asm/unistd.h"
#include <stdio.h>
#include <sys/sysctl.h>

int main()
{
    int res = 0;
    int name[] = { CTL_KERN, KERN_RANDOMIZE };
    int new_params[1];
    new_params[0] = 0;
    
    __asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" 
 : "=a" (res) 
  : "i" (149),"b" ((long)(name)),"c" ((long)(2)), 
 "d" ((long)(0)),"S" ((long)(0)),"D" ((long)(new_params)), 
"0" ((long)(4)) : "memory"); 

    return res;
 }


Alleen als ik het uitvoer (onder root, want die permissies zijn nodig voor deze update) dan blijft de waarde on geupdated. Het volgende programma in C werkt wel precies zoals het moet:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <sys/sysctl.h>

int name[] = { CTL_KERN, KERN_RANDOMIZE };
int printk_params[1];
int new_params[1];

int main() 
{
        int paramlth = sizeof(printk_params);
        new_params[0] = 0;
        if (sysctl(name, 2, 0, 0, new_params, 4)) 
        {
             perror("sysctl");
             exit(1);
         }
        return 0;
}


Iemand een idee waarom het eerste programma niet werkt?
(Source voorbeeld code p1): https://www.codeblog.org/...include/asm-i386/unistd.h

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Ik zou zweren dat eerst in het ASM ding int new_param[0] stond, maar dat zal dan wel niet.
Ik heb even het stukje syscall6 uit de source gehaald, dat maakt het voor anderen misschien wat makkelijker de regels te vergelijken met wat je nu hebt.
maak je eigen code tags even [code=C], dat leest wat prettiger
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
157: #define __NR__sysctl            149

383: #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
384:           type5,arg5,type6,arg6) \
385: type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
386: { \
387: long __res; \
388: __asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" \
389:         : "=a" (__res) \
390:         : "i" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
391:           "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \
392:           "0" ((long)(arg6)) : "memory"); \
393: __syscall_return(type,__res); \
394: }

Maar aangezien je een res returned: wat is daar de waarde van?

[ Voor 3% gewijzigd door Vaan Banaan op 02-10-2010 18:18 ]

500 "The server made a boo boo"


Verwijderd

Topicstarter
C:
1
printf("%d", res);
resulteert in -20

$? geeft 236

C:
1
printf ("Error: %s\n",strerror(errno));


Error: Unknown error 4294967276