1. Си / Говнокод #26202

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    
    int Regctl_set_ioctl5(ulong param_1,ulong param_2)
    
    {
      int __fd;
      int iVar1;
    
      struct {
        ulong addr;
        ulong flags;
        int * resultptr;
        int result;
      } x;
    
      x.addr = param_1;
      x.flags = param_2;
    
      __fd = open("/dev/regctl",O_RDWR);
      if (__fd == 0) { printf("%s: error:  open dev/misc/regctl  fail \n","dwReadRegVal"); } else {
        iVar1 = ioctl(__fd,5,&x);
        if (iVar1 == -1) {
          printf("%s: error:  regctl ioctl fail \n","dwReadRegVal");
          close(__fd);
        }
        else {
          close(__fd);
        }
      }
      printf("iVar1: %d\n", iVar1);
      printf("%d\n", x.result);
      //return __fd;
      return -1;
    }
    
    int Regctl_set_2_dwWriteRegVal(int param_1,int param_2,int param_3)
    
    {
    	int fd; int iVar1;
    	struct {
    		int addr;
    		int flags;
    		int * data;
    	} y;
    	y.addr = param_1;
    	y.flags = param_2;
    	y.data[0] = param_3;
    
      fd = open("/dev/regctl",O_RDWR);
      if (fd == 0) {
        printf("%s: error:  open dev/misc/regctl  fail \n","dwWriteRegVal");
      }
      else {
        iVar1 = ioctl(fd,1,&y);
        if (iVar1 == -1) {
          printf("%s: error:  regctl ioctl fail \n","dwWriteRegVal");
          close(fd);
        }
        else {
          close(fd);
        }
      }
      //return __fd;
      return -1;
    }
    
    void Regctl_main_function(void) {
    	uint uVar1; uVar1 = Regctl_set_ioctl5(0x90c00000,0x54);
    	printf("uVar1: %d\n", uVar1);
    //	Regctl_set_2_dwWriteRegVal(-0x6f400000,0x54,uVar1 & 0xfffc3fff | 0x28000);
    	return;
    }
    
    int main() {
    	Regctl_main_function();
    	return 0;
    }

    выдаёт segfault, что тут не так?

    Запостил: TTcuxonam, 12 Декабря 2019

    Комментарии (21) RSS

    • Поставь на каждой строчке printf'ы и локализуй ошибку.
      Ответить
      • Не отвечай Стертору.
        Ответить
      • Unable to handle kernel NULL pointer dereference at virtual address 00000003
        pgd = 804ac000
        [00000003] *pgd=0043c831, *pte=00000000, *ppte=00000000
        Internal error: Oops: 821 [#1] PREEMPT
        Modules linked in: regctl(O) hi_gpio(O) frammap(O)
        CPU: 0    Tainted: G           O  (3.3.0 #267)
        PC is at regctl_ioctl+0xf0/0x1e8 [regctl]
        LR is at __arm_ioremap_pfn_caller+0xdc/0x270
        pc : [<7f00c100>]    lr : [<8001111c>]    psr: 40000013
        sp : 87dc5f48  ip : 7f00c0f0  fp : 7ee46c6c
        r10: 00000000  r9 : 87dc4000  r8 : 80009b08
        r7 : 00000003  r6 : 00000005  r5 : 00005452  r4 : 7f00c46c
        r3 : 00000003  r2 : 11400000  r1 : 90c00fff  r0 : fe000054
        Flags: nZcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
        Control: 0000397f  Table: 004ac000  DAC: 00000015
        Process 1a (pid: 97, stack limit = 0x87dc4270)
        Stack: (0x87dc5f48 to 0x87dc6000)
        5f40:                   40000093 90c00000 00000054 76f99c19 00008350 00000003
        5f60: 8782e920 800a0c68 8782e928 8008ef64 00000000 00000000 8782e920 7ee46c50
        5f80: 00000005 800a0f28 87dc4000 00000000 7ee46f17 7ee46c50 00000005 00000003
        5fa0: 00000036 80009960 7ee46c50 00000005 00000003 00000005 7ee46c50 7ee46c44
        5fc0: 7ee46c50 00000005 00000003 00000036 00000000 00000000 76fa1f70 7ee46c6c
        5fe0: 76f2ed54 7ee46c20 00008550 76f2ed98 60000010 00000003 00000000 00000000
        [<7f00c100>] (regctl_ioctl+0xf0/0x1e8 [regctl]) from [<800a0c68>] (do_vfs_ioctl+0x78/0x300)
        [<800a0c68>] (do_vfs_ioctl+0x78/0x300) from [<800a0f28>] (sys_ioctl+0x38/0x60)
        [<800a0f28>] (sys_ioctl+0x38/0x60) from [<80009960>] (ret_fast_syscall+0x0/0x2c)
        Code: e59f40f8 e59d3014 e5840000 e5902000 (e5832000) 
        ---[ end trace 5ccdaa19ef709def ]---
        Ответить
      • Это автогенерированный код из асма
        Ответить
    • Непонятно. Перепиши на «PHP».
      Ответить
    • Я вижу ошибки, можно ответить или это Стертор?
      Ответить
      • Можно, я не Стертор, мамой клянусь
        Ответить
        • struct {  int * data; } y;
          y.data[0] = param_3;
          y.data здесь - неинициализированный указатель. Т.е. ты пишешь по случайному адресу. Ну и с resultptr аналогично.
          Ответить
      • #include <stdio.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #include <stdlib.h>
        
        int Regctl_set_ioctl5(ulong param_1,ulong param_2) {
          int __fd; int iVar1; int tmpvar;
        
          struct {
            ulong addr;
            ulong flags;
            int * resultptr;
            int result;
          } x;
        
          x.addr = param_1;
          x.flags = param_2;
          x.resultptr = &tmpvar;
        
          __fd = open("/dev/regctl",O_RDWR);
          if (__fd == 0) { printf("%s: error:  open dev/misc/regctl  fail \n","dwReadRegVal"); } else {
            iVar1 = ioctl(__fd,5,&x);
            if (iVar1 == -1) {
              printf("%s: error:  regctl ioctl fail \n","dwReadRegVal");
              close(__fd);
            }
            else {
              close(__fd);
            }
          }
          return *x.resultptr;
        }
        
        int Regctl_set_2_dwWriteRegVal(int param_1,int param_2,int param_3) {
         int fd; int iVar1;
         int tmparray[2];
         struct {
          int addr;
          int flags;
          int * data;
         } y;
         y.addr = param_1;
         y.flags = param_2;
         y.data = tmparray;
         y.data[0] = param_3;
        
          fd = open("/dev/regctl",O_RDWR);
          if (fd == 0) {
            printf("%s: error:  open dev/misc/regctl  fail \n","dwWriteRegVal");
          }
          else {
            iVar1 = ioctl(fd,1,&y);
            if (iVar1 == -1) {
              printf("%s: error:  regctl ioctl fail \n","dwWriteRegVal");
              close(fd);
            }
            else {
              close(fd);
            }
          }
          //return __fd;
          return 0;
        }
        
        void Regctl_main_function(void) {
         uint uVar1; uVar1 = Regctl_set_ioctl5(0x90c00000,0x54);
         Regctl_set_2_dwWriteRegVal(-0x6f400000,0x54,uVar1 & 0xfffc3fff | 0x28000);
         return;
        }
        
        int main() {
         Regctl_main_function();
         return 0;
        }


        кое-что исправил, но все равно не работает
        Ответить
        • Зачем реверсить бинарник под arm?
          Малость выдаёт segfault.
          Зачем выдаёт segfault?
          Зачем бесплатно и опенсорс?

          Малость не работает,
          Зачем ghidra пробовал?
          Малость выдаёт segfault,
          Много бесплатно и опенсорс.
          Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить

    Добавить комментарий